Linq到实体加入不起作用

时间:2011-05-24 18:26:28

标签: 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
}

5 个答案:

答案 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>