使用包含vs然后包含

Uen*_*tee 8 c# entity-framework entity-framework-core

我一直在尝试使用EntityFramework,在遇到以下错误消息后,我尝试使用ThenInclude来解决它。

无法绑定传递给Include运算符的表达式'[x] .ModelA.ModelB'

但是现在看来我对它为什么能解决问题缺乏了解

这有什么区别:

.Include(x => x.ModelA.ModelB)
Run Code Online (Sandbox Code Playgroud)

和这个:

.Include(x => x.ModelA).ThenInclude(x => x.ModelB)
Run Code Online (Sandbox Code Playgroud)

Vij*_*han 22

“包含”适用于对象列表,但如果您需要获取多级数据,则“ThenInclude”是最合适的。让我用一个例子来解释它。假设我们有两个实体,公司和客户:

public class Company
{
    public string Name { get; set; }

    public string Location { get; set; }

    public List<Client> Clients {get;set;}
}

 public class Client
 {
    public string Name { get; set; }

    public string Domains { get; set; }

    public List<string> CountriesOfOperation { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

现在,如果您只需要公司和该公司的整个客户列表,您可以使用“包括”:

using (var context = new YourContext())
{
  var customers = context.Companies
    .Include(c => c.Clients)
    .ToList();
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要一个带有“CountriesOfOperation”作为相关数据的公司,您可以在包含如下客户之后使用“ThenInclude”:

using (var context = new MyContext())
{
   var customers = context.Companies
    .Include(i => i.Clients)
      .ThenInclude(a => a.CountriesOfOperation)
    .ToList();
}
Run Code Online (Sandbox Code Playgroud)


Kak*_*isk 18

不同之处在于 Include 将引用您最初查询的表,无论它位于链中的哪个位置,而 ThenInclude 将引用最后包含的表。这意味着如果您只使用 Include,您将无法包含第二个表中的任何内容。