LINQ to Entity Framework许多渴望加载问题

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)

Ale*_*mes 7

早期包括经常在某些类型的查询中丢失(即具有额外的连接等)

解决这个问题的方法是进行查询,(然后只要你返回实体,即选择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真正包括在内

亚历克斯