Linq to实体加入不起作用

本文关键字:不起作用 实体 to Linq | 更新日期: 2023-09-27 17:57:29

知道为什么下面的代码不会编译吗?

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
}

Linq to实体加入不起作用

按如下方式重新构造代码。

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;
    }
}

IEnumerable的内容属于System类型。对象,则需要使用var关键字,以便编译器推断用户的类型为某个匿名类型T的IEnumerable<T>。如果要使用匿名类型,请循环使用using块范围内的元素。

尝试在循环中强制转换用户对象。

foreach (var user in users)   
{
    ((User)user).ID;
}
  user.Id; <-----Cannot resolve symbol ID

根据您的代码,它应该是user.ID(大写而非小写)——大写很重要。

此外,您已经将user声明为IEnumerable,因此您不会得到它实际类型的任何属性,只会得到IEnumerable上可用的属性-将它声明为var并在using语句中使用它,或者创建一个类而不是使用匿名类型。

请记住:您通常在SQL中使用联接来完成的任务,可以简单地通过在EF:中移动关系来完成

users = from t2 in ent.UserStatus.Include("User") 
where t2.ExpirationDateTime != null
select t2

这为您提供了所需的UserStatus,并且您可以通过在模型中预先定义的属性User访问每个UserStatusUser