【问题标题】:What is Entity Framework Include() and when to use it? [duplicate]什么是实体框架 Include() 以及何时使用它? [复制]
【发布时间】:2021-03-03 13:26:27
【问题描述】:

我查看了 EF Include() 方法的定义和示例,但不幸的是,对于我的问题“什么是实体框架 Include() 以及何时使用它?”没有适当的解释。

这是一个示例用法。它的一般用途是什么?为什么/何时应该使用它?

    using (var context = new MyContext())
    {
        var list = context.Customers
            .Include(c => c.Invoices)    
            .ToList();    
        
        foreach (var customer in list)
        {
            Console.WriteLine("Customer Name: {0}", customer.Name);
            foreach (var customerInvoice in customer.Invoices)
            {
                Console.WriteLine("\tInvoice Date: {0}", customerInvoice.Date);
            }
        }
    }

【问题讨论】:

  • 在导航属性需要与查找关联时使用了。
  • 基本上是一个JOIN

标签: c# entity-framework asp.net-core .net-core


【解决方案1】:

在您的情况下,我假设“客户”和“发票”是两个单独的表。

假设您有一位客户:

var customer = context.Customers.FirstOrDefault();

如果您尝试获取该客户的发票:

customer.Invoices

会发生什么?这将取决于您的 ORM 配置。有两种模式。

延迟加载 使用该模式(我认为这是默认模式),您将首先调用数据库以检索客户(但只有客户),然后再调用数据库以检索该客户的发票。但第二次调用只会在您尝试获取发票时才会发生。

渴望加载 如果您不想进行多个数据库调用并且希望在一次调用中获取所有数据,则可以禁用延迟加载。但是,如果您以与我在上面显示的相同的方式获得客户,您将不会获得发票(您将获得“null”)。 “包含”允许 EF 知道您要在一次数据库调用中检索客户和发票:

var customer = context.Customers.Includes(c => c.Invoices).FirstOrDefault();

当您尝试获取该客户的发票时,所有内容都已在内存中,因此无需额外的数据库调用。

【讨论】:

  • 很好的解释,非常感谢。投票并标记为当然答案。
【解决方案2】:

考虑 Invoice id 是主键,customers.invoiceid 是外键。 如果您映射正确的导航属性

调用 Include("Invoices") 的最终语句可能如下所示:

选择 * FROM Customers JOIN Invoices ON Customers.InvoiceId = Invoices.Id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多