我正在使用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);
}
感谢您的帮助。
答案 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 ) )