C# 在对反向属性使用EF 4.1时,如何使用linq的.Include()?

C# 在对反向属性使用EF 4.1时,如何使用linq的.Include()?,c#,entity-framework-4.1,C#,Entity Framework 4.1,我无法确定如何使用.Include来访问此嵌套关系。我尝试了看起来最直接的方法,但intellisense没有填充,当我手工输入关系时,出现了编译错误 我有这个数据库映射设置 public class W { public int WId { get; set; } public virtual ICollection<T> Ts { get; set; } } public class T { public int TId { get; set; } public int

我无法确定如何使用.Include来访问此嵌套关系。我尝试了看起来最直接的方法,但intellisense没有填充,当我手工输入关系时,出现了编译错误

我有这个数据库映射设置

public class W
{
 public int WId { get; set; }
 public virtual ICollection<T> Ts { get; set; }
}

public class T
{
 public int TId { get; set; }
 public int WId { get; set; }
 public int CId { get; set; }
 public virtual W W { get; set; }
 public virtual C { get; set; }
}

public class C
{
 public int CId { get; set; }
 public virtual ICollection<T> Ts { get; set; }
}
我有一个get方法可以查询

//set in constructor
DbSet<W> dbSet;
DbContext context;

//called in method
IQueryable<W> query = dbSet;
query = query.Include(w => w.Ts);//works
query = query.Include(w => w.Ts.C); //I wanted to do this but it doesn't work
我能用这个吗?
看起来它会顺利工作,但显然我做错了。我不希望每次迭代Ts集合,然后手动填充它们的C。

您可以使用以下语法:

query = query.Include(w => w.Ts.Select(t => t.C));

您可以使用以下语法:

query = query.Include(w => w.Ts.Select(t => t.C));

顺便说一句:你的问题标题中不是指嵌套属性而不是反向属性吗?@Slauma-不是,我认为虚拟集合被认为是反向属性。类T持有W的外键,W持有具有该外键的T对象的集合。我的印象是这被认为是一个反向属性,你甚至可以用数据注释明确地标记它,在这里应用为[InversePropertyW]上面W对Ts ICollection的定义虽然这是多余的,因为如果Id和外部导航名称使用命名约定,EF将自动执行此操作。W.T集合是T.W引用的反向属性,T.W引用是W.T集合的反向属性,但它在某种程度上是对称的。你的问题看起来更像是W->T->C,C嵌套在T中:如果你去掉T.W和C.Ts,答案也会适用,那么就没有什么相反的了。不管怎样,忘了我的评论吧,我只是认为这是一个输入错误……顺便说一下:你的问题标题中不是指嵌套属性而不是反向属性吗?@Slauma-不,我认为虚拟集合被认为是反向属性。类T持有W的外键,W持有具有该外键的T对象的集合。我的印象是这被认为是一个反向属性,你甚至可以用数据注释明确地标记它,在这里应用为[InversePropertyW]上面W对Ts ICollection的定义虽然这是多余的,因为如果Id和外部导航名称使用命名约定,EF将自动执行此操作。W.T集合是T.W引用的反向属性,T.W引用是W.T集合的反向属性,但它在某种程度上是对称的。你的问题看起来更像是W->T->C,C嵌套在T中:如果你去掉T.W和C.Ts,答案也会适用,那么就没有什么相反的了。不管怎样,忘了我的评论吧,我只是认为这是一个打字错误…使用这种语法,我遇到了加载错误数据的问题。请看这里:使用这种语法,我遇到了加载错误数据的问题。请看这里: