【问题标题】:LINQ to Entity Framework Many-Many Eager Loading issueLINQ to Entity Framework Many-Many Eager Loading 问题
【发布时间】:2009-06-01 20:18:33
【问题描述】:

我有以下疑问:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              select e;

一切正常,我得到了我的设备,它正确(急切地)加载了制造商表。但是当我尝试执行以下多对多查询时:

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;

其中“ContractEquipments”是“Equipments”和“Contracts”之间的多对多查找,但是当此查询运行时,无法再轻松加载制造商表。知道如何在不执行以下操作的情况下解决此问题:

if (MyEntity.Manufacturers.IsLoaded == false) 
   MyEntity.ManufacturersReference.Load()

这个项目需要几个小时才能执行,我想减少数据库调用的次数。

编辑#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;

【问题讨论】:

    标签: c# .net linq entity-framework eager-loading


    【解决方案1】:

    早期包含经常在某些类型的查询中丢失(例如,带有额外的连接等)

    解决这个问题的方法是进行查询,(然后只要您返回实体,即选择 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");
    

    这应该可行。

    如果您对此感兴趣,请查看Tip 22 - How to make Include really Include

    亚历克斯

    【讨论】:

    • 只是想知道,早期包含的目的不是在查询本身中向该实体添加某种功能吗?例如,如果您想 Include("Manufacturers") 并将其包含在 where 子句中,例如,如果您想获取在纽约找到的相关制造商的列表。
    【解决方案2】:

    您是否尝试过这样的连接?

    var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
                  where e.Customers.ID == customer.ID
                  join cce in e.ContractEquipments on e.Id equals cce.EquipmentId
                  where cce.Contracts.EndedOn >= DateTime.Today
                  select e;
    

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多