包含路径表达式必须引用在类型为“ EF使用关系表”上定义的导航属性

时间:2019-02-21 08:40:45

标签: entity-framework linq

我正在处理多个表,例如主表和子表。一位主人有很多孩子的记录。我只想获取基于条件的子记录。当我尝试获取记录时,它给了我以下错误。

  

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

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条记录。

1 个答案:

答案 0 :(得分:0)

确定要使用“包含”而不是“选择”吗?

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

如果PurchaseOrder 4具有1000个PurchaseOrderDetails,则每个PurchaseOrderDetail将具有一个值为4的外键PurchaseOrderId。将相同的值四次传输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