Соединение Linq с объектами не работает

#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 , которое точно определено в вашей модели.