Linq 查询在多个条件下加入

Linq Query join on multiple conditions

尝试执行一个查询,将来自多个连接的数据组合成一个 属性

Rig
----
   RigId
   Component1Id
   Component2Id
   Component3Id


Work Item
---------
  Id
  ComponentID
  Description

我正在尝试查询 returns 具有单个 属性 历史记录的装备列表,其中包含与装备中的组件关联的所有工作项。

我似乎无法在联接中执行多个条件或执行单独的联接并将项目连接成一个 属性。

所以结果是这样的

RigId、History(包含钻机所有工作项的列表)

这是查询语法的答案:

var ans = from r in Rigs
          join w in WorkItems on r.Component1ID equals w.ComponentID into wg1
          join w in WorkItems on r.Component2ID equals w.ComponentID into wg2
          join w in WorkItems on r.Component3ID equals w.ComponentID into wg3
          select new { r.RigID, History = wg1.Concat(wg2).Concat(wg3).ToList() };

如果您愿意,可以使用 lambda 语法(这有点难...)

var ans2 = Rigs.GroupJoin(WorkItems, r => r.Component1ID, w => w.ComponentID, (r, w1g) => new { r, h1 = w1g.ToList() })
               .GroupJoin(WorkItems, rh1 => rh1.r.Component2ID, w => w.ComponentID, (rh1, w2g) => new { rh1.r, h2 = rh1.h1.Concat(w2g.ToList()) })
               .GroupJoin(WorkItems, rh2 => rh2.r.Component3ID, w => w.ComponentID, (rh2, w3g) => new { rh2.r.RigID, History = rh2.h2.Concat(w3g.ToList()) });

我不认为为组件使用列是个好主意 - 当 Rig 的组件多于或少于 3 个时会发生什么情况?你真的应该有一个单独的 RigComponent table.