Linq to SQL - Left Outer加入多个条件并显示所有列

时间:2013-07-25 15:16:41

标签: sql linq c#-4.0

我已经仔细考虑了使用多个条件将LINQ中的表连接到左连接的其他问题,并尝试了我认为相关的示例,但我无法创建C#LINQ代码来获得我需要的结果。

我有两张桌子。第一个是ProductionOptions,第二个是ProductionOrderDetailsOptions。

这是ProductionOptions表的内容(为了简洁起见,用optionType过滤)

optionType  optionValue            order     showTextBox
----------------------------------------------------------
PACKAGING   BLACK BOX                   8   False
PACKAGING   CUSTOM FOLDING WITH LOGO    4   True
PACKAGING   FLANNEL DUST BAG            6   False
PACKAGING   FOLDING                     2   False
PACKAGING   IMAGE FOLDING               1   False
PACKAGING   NAVY BOX                    9   False
PACKAGING   OTHER                      13   True
PACKAGING   PLAIN FOLDING               3   False
PACKAGING   POLYBAG                     5   False
PACKAGING   SET UP BOX BLACK           11   True
PACKAGING   SET UP BOX CREAM           10   True
PACKAGING   SET UP BOX NAVY            12   True
PACKAGING   SHRINK WRAP                 7   False

这是ProductionOrderDetailsOptions表:

orderNo detailKey   optionType  optionValue                 optionAdditionalInfo
---------------------------------------------------------------------------
000001  1           PACKAGING   IMAGE FOLDING   
000001  1           PACKAGING   POLYBAG NULL
000001  1           PACKAGING   SET UP BOX BLACK            needs white lettering
000007  4           PACKAGING   CUSTOM FOLDING WITH LOGO    BMW

现在,我希望在左边连接到ProductionOrderDetailsOptions表时显示ProductionOptions表中的所有行。

这是我需要的LINQ的SQL等价物:

  

SELECT *
      来自ProductionOptions po
  LEFT JOIN   po.optionType = o.optionType上的ProductionOrderDetailsOptions o       AND po.optionValue = o.optionValue
      AND o.orderNo ='000001'
  AND o.detailKey = 1
  在哪里po.optionType ='PACKAGING'

以下是我想要的结果: Desired Output

表面上我想将LINQ结果绑定到像GridView这样的对象。

如果你走到这一步,我想感谢你的耐心......

2 个答案:

答案 0 :(得分:0)

如果你有FK关系,那就是这样:

var items = ProductionOptions
.Where(p => p.ProductionOrderDetailsOptions == null || p.ProductionOrderDetailsOptions.optionType.Equals(p.optionType))
.Where(p => p.ProductionOrderDetailsOptions == null ||p.ProductionOrderDetailsOptions.optionValue.Equals(p.optionValue))
.Where(p => p.ProductionOrderDetailsOptions == null ||p.ProductionOrderDetailsOptions.orderNo.Equals("000001"))
.Where(p => p.ProductionOrderDetailsOptions == null ||p.ProductionOrderDetailsOptions.detailKey.Equals(1))
.Where(p => p.optionType.Equals("PACKAGING"))
.AsEnumerable();

foreach(var item in result)
{
   //ProductionOptions
   Console.WriteLine(item.optionType);
   //ProductionOrderDetailsOptions
   Console.WriteLine(item.ProductionOrderDetailsOptions.detailKey);
}

答案 1 :(得分:0)

两个表之间的左外连接可以像这样完成。这里需要注意的是,在select语句中g可以为null,因此在从左外连接获取字段值时,我们必须处理null条件..

(from po in ProductionOptions.Where(p=> p.optionType == "PACKAGING")
 join o in ProductionOrderDetailsOptions.Where(d=> d.orderNo == "000001" && d.detailKey == 1 )
 on new {po.optionType, po.optionValue } equals new {d.optionType, d.optionValue } into gs
 from g in gs.DefaultIfEmpty()
 select new {po.optionType, ..
             orderNo = g?.orderNo, ...}
 )