我正在处理多个表,例如主表和子表。一位主人有很多孩子的记录。我只想获取基于条件的子记录。当我尝试获取记录时,它给了我以下错误。
包含路径表达式必须引用导航属性 在类型上定义
这是我的代码
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条记录。
答案 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