2014-02-08 50 views
0

我正在使用EF 4并且有Consultant,User和OrganisationArea实体。 每个顾问实体都有一个用户导航属性,每个用户实体可以分配给许多OrganisationAreas。我正在尝试获得一个顾问名单,这些顾问的内嵌用户属性分配给了某个组织单位区域。LINQtoEntities包括不检索导航属性

我的顾问实体还具有由它的名字及姓氏结合用户的属性,像这样返回一个顾问的全名是只读属性:

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; 

当我创建和新视型顾问的一个ObservableCollection和尝试绑定到集合中的FullName属性,用户为空。

我已经解决了选择一个匿名类型和访问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); 
} 

感谢您的帮助。

回答

0

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

这是我送给你的查询建议(不以_dbContext.OrganisationAreas一个参考,因为我不能告诉它如何与查询的其余部分):

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