#c# #.net #linq #entity-framework #linq-to-entities
#c# #.net #linq #entity-framework #соединение linq-to-entities
Вопрос:
Есть идеи, почему следующий код не будет компилироваться?
IEnumerable users;
using (var ent = new GatekeeperEntities())
{
users = from t1 in ent.Users
join t2 in ent.UserStatus1 on t1.ID equals t2.UserId
where t2.ExpirationDateTime != null
select new {t1.ID, t1.Name, t1.UserName, t2.Status };
}
foreach (var user in users)
{
user.ID; // Cannot resolve symbol ID
}
Ответ №1:
Реструктурируйте свой код, как показано ниже.
using (var ent = new GatekeeperEntities())
{
var users = from t1 in ent.Users
join t2 in ent.UserStatus1 on t1.ID equals t2.UserId
where t2.ExpirationDateTime != null
select new {t1.ID, t1.Name, t1.UserName, t2.Status };
foreach (var user in users)
{
user.ID;
}
}
Комментарии:
1. Даже при определении
users
какvar
вместоIEnumerable
?2. Вы не забыли использовать var вместо IEnumerable?
Ответ №2:
Содержимое IEnumerable
имеет тип System.Объект, вместо этого вам нужно использовать ключевое слово var, чтобы компилятор определил, что users относится к типу IEnumerable<T>
для некоторого анонимного типа T. Если вы хотите использовать анонимный тип, выполните цикл по элементам внутри области блока using.
Ответ №3:
Попробуйте привести свой пользовательский объект в цикл.
foreach (var user in users)
{
((User)user).ID;
}
Ответ №4:
user.Id; <-----Cannot resolve symbol ID
Согласно вашему коду это должно быть user.ID
(в верхнем, а не в нижнем регистре) — заглавные буквы имеют значение.
Также вы user
объявили as IEnumerable
— поэтому вы не получите никаких свойств того типа, которым оно является на самом деле, только свойства, доступные на IEnumerable
— объявите его как var и используйте его внутри инструкции using или создайте класс вместо использования анонимного типа.
Комментарии:
1. Извините, я это исправил, это user.ID . Та же ошибка. Это не приведет к интеллектуальному преобразованию ни одного из свойств.
Ответ №5:
И помните: то, что вы обычно выполняете с помощью объединений в SQL, может быть просто выполнено путем перемещения по отношениям в EF:
users = from t2 in ent.UserStatus.Include("User")
where t2.ExpirationDateTime != null
select t2
Это дает вам UserStatus
элементы, которые вы хотите, и вы можете получить доступ к User
каждому UserStatus
через свойство User
, которое точно определено в вашей модели.