Include路径表达式必须引用在类型EF上定义的导航属性。使用关系表[duplicate]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Include路径表达式必须引用在类型EF上定义的导航属性。使用关系表[duplicate]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我正在使用多个表,如主表和子表。一位大师有很多儿童记录。我只想在有条件的基础上获取子记录。当我试图获得记录时,它会给我以下错误。
Include路径表达式必须引用在类型上定义的导航属性
这是我的代码
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]的主要内容,如果未能解决你的问题,请参考以下文章
包含路径表达式必须引用在类型上定义的导航属性(使用 LINQ 选择数据)
包含路径表达式必须引用 type.in 预加载中定义的导航属性