LINQ to Entities包括不检索nav属性

时间:2014-02-08 14:18:18

标签: c# linq linq-to-entities

我正在使用EF 4并拥有Consultant,User和OrganisationArea实体。 每个Consultant实体都有一个User导航属性,每个User实体都可以分配给许多OrganisationAreas。我正在尝试获取一份顾问列表,其中包含已分配到某个组织区域的嵌入式用户属性。

我的顾问实体也有一个只读属性,它通过结合用户属性的名字和姓氏来返回顾问的全名,如下所示:

public string FullName 
{
    get { return User.Forename + " " + User.Surname; }
}

以下Linq有效,它会检索根据我的需要分配的顾问,但不包括其用户属性。你能明白为什么吗?

var result = from c in _dbContext.Consultants.Include("User")
             from u in _dbContext.SystemUsers
             from oa in _dbContext.OrganisationAreas
             where oa.OrganisationAreaId == _sharedInfo.LoggedInSite.OrganisationAreaId
                 && u.Current
                 && c.UserId == u.UserId
                 && c.User.Sites.Count(s => s.OrganisationAreaId == _sharedInfo.LoggedInSite.OrganisationAreaId) > 0
             select c;

当我创建并新建一个类型为Consultant的ObservableCollection并尝试将该属性绑定到该集合时,User为null。

我已经解决了选择匿名类型并访问consultant.user以进行项目然后循环遍历我的匿名类型,如下所示,但我想了解我错过了什么?

var result = from c in _dbContext.Consultants
             from u in _dbContext.SystemUsers
             from oa in _dbContext.OrganisationAreas
             where oa.OrganisationAreaId == _sharedInfo.LoggedInSite.OrganisationAreaId
                 && u.Current
                 && c.UserId == u.UserId
                 && c.User.Sites.Count(s => s.OrganisationAreaId == _sharedInfo.LoggedInSite.OrganisationAreaId) > 0
             select
             new
             {
                 Consultant = c,
                 User = c.User
             };

var theConsultants = result.ToList();
ConsultantUsers = new ObservableCollection<Consultant>();

foreach (var rec in theConsultants)
{
    ConsultantUsers.Add(rec.Consultant);
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

当查询的形状没有改变时,Linq to Entities只会通过Include(...)急切加载(因此很明显)。您正在从三个不同的DbSet<T>中进行选择,甚至没有指定任何连接,我的赌注是L2E不知道查询的形状应该是什么。 oa甚至不适用于查询的其余部分,为什么会在那里?

这是我对您的查询的建议(没有引用_dbContext.OrganisationAreas,因为我无法告诉它与查询的其余部分有什么关系):

_dbContext.Consultants.Include( "User" )
    .Where( c => 
        c.User.Current &&
        c.User.Sites.Any( s => 
            s.OrganisationAreaId == _sharedInfo.LoggedInSite.OrganisationAreaId ) )