知道为什么以下代码无法编译?
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
}
答案 0 :(得分: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 :(得分:1)
IEnumerable
的内容属于System.Object类型,您需要使用var关键字,以便编译器推断某些匿名类型T的用户类型为IEnumerable<T>
。你想使用匿名类型,循环使用块的范围内的元素。
答案 2 :(得分:0)
user.Id; <-----Cannot resolve symbol ID
根据您的代码,它应该是user.ID
(大写不是小写) - 大写是重要的。
此外,您将user
声明为IEnumerable
- 因此您将无法获得其实际类型的任何属性,只有IEnumerable
上可用的属性 - 将其声明为var和在using语句中使用它,或者创建一个类而不是使用匿名类型。
答案 3 :(得分:0)
尝试在循环中转换用户对象。
foreach (var user in users)
{
((User)user).ID;
}
答案 4 :(得分:-1)
请记住:在SQL中通常使用连接完成的任务可以通过在EF中移动关系来完成:
users = from t2 in ent.UserStatus.Include("User")
where t2.ExpirationDateTime != null
select t2
这为您提供了所需的UserStatus
,并且您可以通过模型中可预定义的属性User
访问每个UserStatus
的{{1}}。< / p>