Include路径表达式必须引用在类型EF上定义的导航属性。使用关系表[duplicate]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Include路径表达式必须引用在类型EF上定义的导航属性。使用关系表[duplicate]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我正在使用多个表,如主表和子表。一位大师有很多儿童记录。我只想在有条件的基础上获取子记录。当我试图获得记录时,它会给我以下错误。

Include路径表达式必须引用在类型上定义的导航属性

enter image description here

这是我的代码

 var _vatId = (int)Enumerations.Enumerations.Vat.Standard;
            var master = _db.PurchaseOrderMaster.Include(x => x.tbl_PurchaseOrderDetails.Where(a => a.VatId == _vatId)).FirstOrDefault(x => x.Id == PurchaseOrderId);

为什么我这样做是因为如果master有1000个子记录而我只需要100个,那么我必须使用where子句来获取100条记录而不是1000条记录。

答案

您确定要使用Include而不是Select吗?

数据库查询的较慢部分之一是将所选数据从DBMS传输到本地进程。因此,仅选择您实际计划使用的数据是明智的。

如果PurchaseOrder 4有1000个PurchaseOrderDetails,那么每个PurchaseOrderDetail将有一个值为4的外键PurchaseOrderId。将此相同的值传输4 1001次是浪费,而1次就足够了。

// fetch (several properties of) purchase orders with their details
var result = dbContext.PurchaseOrders
    .Where(purchaseOrder => ...)          // only if you don't want all Purchase Orders
    .Select(purchaseOrder => new
    
         // select only the properties that you plan to use
         Id = purchaseOrder.Id,
         Name = purchaseOrder.Name,
         ...

         Details = purchaseOrder.PurchaseOrderDetails
             // only if you don't want all Details of this purchase order:
             .Where(detail => ...)        
             .Select(detail => new
             
                  // again: select only the properties you plan to use
                  Id = detail.Id,
                  ...

                  // not needed: you know the value:
                  // PurchaseOrderId = detail.PurchaseOrderId,
             )
             .ToList(),
    );

在实体框架中,始终使用“选择”来查询数据,并仅选择实际计划使用的属性。如果要更新提取的数据,请仅使用Include

以上是关于Include路径表达式必须引用在类型EF上定义的导航属性。使用关系表[duplicate]的主要内容,如果未能解决你的问题,请参考以下文章

EF Lambda:包含路径表达式必须引用导航属性[重复]

包含路径表达式必须引用在类型上定义的导航属性(使用 LINQ 选择数据)

包含路径表达式必须引用 type.in 预加载中定义的导航属性

EF生成 类型“System.Data.Entity.DbContext”在未被引用的程序集中定义

对const的引用(常量引用)

Include 中使用的 Lambda 表达式无效。 EF6,导航属性