Jas*_*ver 2 .net c# linq entity-framework eager-loading
我有以下查询:
var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
where e.Customers.ID == customer.ID
select e;
Run Code Online (Sandbox Code Playgroud)
一切正常,我得到我的设备,它正确加载制造商表(热切).但是,当我尝试执行以下多对多查询时:
var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
where e.Customers.ID == customer.ID
from cce in e.ContractEquipments
where cce.Contracts.EndedOn >= DateTime.Today
select e;
Run Code Online (Sandbox Code Playgroud)
其中"ContractEquipments"是"设备"和"合同"之间的多对多查找,但是当此查询运行时,制造商表不再容易加载.知道如何在不执行以下操作的情况下解决此问题:
if (MyEntity.Manufacturers.IsLoaded == false)
MyEntity.ManufacturersReference.Load()
Run Code Online (Sandbox Code Playgroud)
这个项目需要几个小时执行,我想保持数据库调用的数量.
编辑#1:
我也尝试了这个没有成功:
var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
where e.Customers.ID == customer.ID
join cce in ContractContext.ContractEquipments
on e.ID equals cce.Equipments.ID
where cce.Contracts.EndedOn >= DateTime.Today
select e;
Run Code Online (Sandbox Code Playgroud)
早期包括经常在某些类型的查询中丢失(即具有额外的连接等)
解决这个问题的方法是进行查询,(然后只要你返回实体,即选择e而不是投影,即选择新的{...})你可以转换为ObjectQuery并在外面做包含:
var MyQuery = ((from e in ContractContext.Equipments
where e.Customers.ID == customer.ID
from cce in e.ContractEquipments
where cce.Contracts.EndedOn >= DateTime.Today
select e) as ObjectQuery<Equipment>).Include("Manufacturers");
Run Code Online (Sandbox Code Playgroud)
这应该工作.
如果您对此有更多信息感兴趣,请查看提示22 - 如何使Include真正包括在内
亚历克斯