【问题标题】:Linq Include property in every item of the listLinq 在列表的每个项目中包含属性
【发布时间】:2018-02-13 14:54:57
【问题描述】:

我有这 4 个课程。

它们被用于层次结构:

  class Reception {
      virtual List<Pallets> Pallets { get; set; }
      float Weight { get; set; }
  }

  class Pallet {
      virtual List<PalletDetail> PalletDetail { get; set; }
  }

  class PalletDetail {
      virtual Package Package { get; set; }
      int Quantity { get; set; }
  }

  class Package {
      float Weight { get; set; }
  }

对于每个接收我想计算重量,所以我有这样的东西:

foreach (var reception in dbContext.Receptions
    .Include(a => a.Pallets)
    .Include(a => a.Pallets.Select(b => b.PalletDetail))
    .ToList())
{
    reception.Weight = reception.Pallets
                            .SelectMany(p => p.PalletDetail)
                            .Sum(r => r.Quantity * r.Package.Weight) ?? 0;
}

dbContext.SaveChanges();

问题是对象Package没有被包含在查询中,所以之前的foreach在每次迭代中都会生成一个SQL查询

问题:我怎样才能包含它? (语法是什么?)

【问题讨论】:

  • 怎么样?这就是问题:“我怎样才能包含它?”
  • 可能的欺骗:stackoverflow.com/questions/34730005/… - 虽然 EF 版本可能不同,但如果您使用 Code-First,那么它应该是相似的......而且是的,大卫所说的也可能是好的 :)
  • .Include(a =&gt; a.Pallets.Select(b =&gt; b.PalletDetail.Package))
  • 嗯,错了... b.PalletDetail 是一个列表...
  • 没有区别,因为获取.Package,它会自动包含PalletDetail和Pallets

标签: c# linq


【解决方案1】:

你只需要包含这个包,用一个替换你所有的包:

var receptions = dbContext.Receptions
    .Include(r => r.Pallets
        .Select(p => p.PalletDetail
            .Select(pd => pd.Package)))
    .ToList());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多