gpt4 book ai didi

c# - Linq 多对多包括

转载 作者:行者123 更新时间:2023-11-30 16:05:48 24 4
gpt4 key购买 nike

我有 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");

我总是收到相同的消息:

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.

我想了解错误信息。

我的问题:

  • “公共(public)虚拟 ICollection AB”是导航属性吗?
  • 什么是虚线路径?
  • “引用导航属性”和“集合导航属性”有什么区别?
  • 我应该更改什么以使我的请求生效?

最佳答案

Is "public virtual ICollection ABs" a navigation property ?
What's the difference between "reference navigation properties" and "collection navigation properties" ?

是的。导航属性是一种属性,您可以通过它从一个实体“导航”到另一个实体。它们有两种口味。 A.ABs 是一个集合 导航属性,AB.B 是一个引用 导航属性。其他属性,如 A.Name,称为标量属性

What are dotted paths ?

路径中有一个点。但这里的信息并不是很清楚。它适用于嵌套在其他导航属性中的包含属性。

因此集合导航属性包含在 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 的引用。好吧,很难想出清晰的简短的异常消息。

What should I change to get my request to work ?

消息不是很清楚,但更糟糕的是,它也没有说明问题所在。您确实使用了在类型上定义的导航属性!

Include(a => a.ABs.Select(ab => ab.B).Where(b => b.Id == 1))

但是您不能在其中包含Where。这是一个臭名昭著的陷阱。 lambda 语法建议任何 LINQ 方法都可以在 Include 中使用,但实际上只有 Select允许附加导航属性。

您想要的是一个经常被请求的功能:过滤包含。目前,EF 仅支持包含完整集合。在 EF 7 中,将支持最终过滤的 Include

在那之前,您必须使用变通方法,例如 this one .

关于c# - Linq 多对多包括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33085382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com