Linq很多都包括在内

时间:2015-10-12 15:57:36

标签: c# linq many-to-many

我有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运算符作为集合导航属性。

我想了解错误消息。

我的问题:

  • “public virtual ICollection ABs”是导航属性吗?
  • 什么是虚线路径?
  • “参考导航属性”和“集合导航属性”之间有什么区别?
  • 我应该更改什么才能让我的工作请求?

2 个答案:

答案 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))

(其中CeesAB

中的集合

参考导航属性包含在点中:

DbContext.Set<A>().Include(a => a.D.F)

(其中DF是参考)

但对我来说根本不清楚,因为......

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