【问题标题】:LINQ join query with multiple fields using left outer join使用左外连接的多个字段的 LINQ 连接查询
【发布时间】: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 表中不存在)。

【问题讨论】:

  • 名为Foo1Foo2 等的列通常表明您的数据模型有误。
  • @mark byers:应该支持某种关系表(只是为了完成您的评论)
  • 我们的客户有各种产品。不同的产品会有不同的产品官、财务官、项目官指派负责产品。这是要求。

标签: c# .net linq


【解决方案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()
                };
    

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 2020-06-12
      • 2023-03-19
      • 2018-07-03
      • 1970-01-01
      相关资源
      最近更新 更多