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
}
按如下方式重新构造代码。
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
访问每个UserStatus
的User
。