我有3个实体
public class A
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<AB> ABs { get; set; }
}
public class AB
{
public int AId { get; set; }
public virtual A A { get; set; }
public int BId { get; set; }
public virtual B B { get; set; }
}
public class B
{
public int Id { get; set; }
public virtual ICollection<AB> ABs { get; set; }
}
我需要在Linq中编写以下SQL:
SELECT * FROM A, AB
WHERE
A.Name = 'name'
AND AB.BId = 1
我试过了:
DbContext.Set<A>().Include(a => a.ABs.Select(ab => ab.B).Where(b => b.Id == 1)).Single(a => a.Name == "name");
DbContext.Set<A>().Include(a => a.ABs.Where(ab => ab.BId == 1)).Single(a => a.Name == "name");
DbContext.Set<A>().Include(a => a.ABs.Select(ab => ab.BId == 1).Single(a => a.Name == "name");
DbContext.Set<A>().Include(a => a.ABs.Any(ab => ab.BId == 1)).Single(a => a.Name == "name");
我总是得到同样的信息:
Include路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性。
我想了解错误消息。
我的问题:
答案 0 :(得分:2)
&#34;公共虚拟ICollection ABs&#34;导航属性?
&#34;参考导航属性&#34;之间的区别是什么?和&#34;集合导航属性&#34; ?
是。导航属性是您导航&#34;从一个实体到另一个实体。它们有两种口味。 A.ABs
是集合导航属性,AB.B
是参考导航属性。其他属性(如A.Name
)称为标量属性。
什么是虚线路径?
带有点的路径。但这里的信息并不清楚。它适用于嵌套在其他导航属性中的包含属性。
所以集合导航属性包含在Select
:
DbContext.Set<A>().Include(a => a.AB.Select(ab => ab.Cees))
(其中Cees
是AB
)
参考导航属性包含在点中:
DbContext.Set<A>().Include(a => a.D.F)
(其中D
和F
是参考)
但对我来说根本不清楚,因为......
Include(a => a.ABs.Select(ab => ab.B))
...包含Select
的引用。好吧,很难设想清晰的和简短的异常消息。
我应该更改什么才能让我的请求发挥作用?
信息不太清楚,但更糟糕的是,它也没有说出错误。您执行使用类型上定义的导航属性!
Include(a => a.ABs.Select(ab => ab.B).Where(b => b.Id == 1))
但你不能拥有Where
。这是一个臭名昭着的陷阱。 lambda语法建议可以在Include
中使用任何LINQ方法,但实际上只允许Select
和.
附加导航属性。
您想要的是经常要求的功能:过滤包含。目前,EF仅支持包括完整收藏。在EF 7中,最终将支持过滤的Include
。
在此之前,您必须使用解决方法,例如this one。
答案 1 :(得分:0)
var ww = _context.Agentes.Include(a => a.AgentesObjetos.Select(ab => ab.Objeto)).ToList();
错误
InvalidOperationException:包含属性lambda表达式a => {from AgenteObjeto ab in a.AgentesObjetos select [ab].Objeto}
无效。
表达式应表示属性访问:t => t.MyProperty
。
要在派生类型上声明的目标导航,请指定目标类型的显式输入的lambda参数,例如(Derived d) => d.MyProperty
。
有关此主题的更多信息,包括相关数据,请参见http://go.microsoft.com/fwlink/?LinkID=746393。