使用左外连接的多个字段的 LINQ 连接查询
Posted
技术标签:
【中文标题】使用左外连接的多个字段的 LINQ 连接查询【英文标题】:LINQ join query with multiple fields using left outer join 【发布时间】:2011-04-29 00:52:52 【问题描述】:我有产品表和官员表如下:
产品
ProductID | ProductName | Officer1ID | Officer2ID | Officer3ID
--------- | ----------- | ---------- | ---------- | ----------
12 | Mouse | 123 | 124 | 125
13 | Keyboard | 234 | 235 | 0
军官
OfficerID | OfficerName
--------- | -----------
123 | John
124 | Andy
125 | Mark
我需要将 Product 表中的 3 列(Officer1ID、Officer2ID、Officer3ID)与Officer 表中的OfficerID 连接起来,以产生如下结果:
ProductID | ProductName | Officer1Name | Officer2Name | Officer3Name
--------- | ----------- | ------------ | ------------ | ------------
12 | Mouse | John | Andy | Mark
13 | Keyboard | Dave | Fred | Leon
这是我的尝试。我知道如何加入 1 个字段,但不能加入多个字段。任何人都可以帮忙吗?谢谢!
List<Product> lstProduct = GetProducts();
List<Officer> lstOfficer = GetOfficers();
var merge = from p in lstProduct
join from o in lstOfficers on p.Officer1ID equals o.OfficerID
select new ProductID = p.ProductID, ProductName = p.ProductName, OfficerName = o.OfficerName ;
编辑 Product 表中的OfficerID 可以为0(Officer 表中不存在)。
【问题讨论】:
名为Foo1
、Foo2
等的列通常表明您的数据模型有误。
@mark byers:应该支持某种关系表(只是为了完成您的评论)
我们的客户有各种产品。不同的产品会有不同的产品官、财务官、项目官指派负责产品。这是要求。
【参考方案1】:
只需应用连接 3 次(每个 OfficerID
一次):
var merge = from p in lstProduct
join o1 in lstOfficer on p.Officer1ID equals o1.OfficerID
join o2 in lstOfficer on p.Officer2ID equals o2.OfficerID
join o3 in lstOfficer on p.Officer3ID equals o3.OfficerID
select new
ProductID = p.ProductID,
ProductName = p.ProductName,
Officer1Name = o1.OfficerName,
Officer2Name = o2.OfficerName,
Officer3Name = o3.OfficerName
;
【讨论】:
感谢您的回答。这与我正在寻找的非常接近。我忘了提到 Product 表中的一些 OfficerIDs 是 null/empty。【参考方案2】:您可以使用multiple joins 执行此操作。
您应该重新考虑您的数据模型。我建议使用junction table 建立多对多关系:
产品
ProductID | ProductName | ProductOfficiersID
--------- | ----------- | ----------
12 | Mouse | 1
13 | Keyboard | 2
产品官员
ProductOfficiersID | ProductID | OficierId
------------------ | --------- | -----------
1 | 12 | 123
1 | 12 | 124
1 | 12 | 125
2 | 13 | 234
...
军官 ...
【讨论】:
【参考方案3】:我最终使用了子查询,灵感来自 this thread。
var merge = from p in lstProduct
select new
p.ProductID,
p.ProductName,
Officer1Name = (from o in lstOfficer
where o.OfficerID == p.Officer1ID
select o.OfficerName).FirstOrDefault(),
Officer1Name = (from o in lstOfficer
where o.OfficerID == p.Officer2ID
select o.OfficerName).FirstOrDefault(),
Officer2Name = (from o in lstOfficer
where o.OfficerID == p.Officer3ID
select o.OfficerName).FirstOrDefault()
;
感谢大家的帮助!
【讨论】:
以上是关于使用左外连接的多个字段的 LINQ 连接查询的主要内容,如果未能解决你的问题,请参考以下文章