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 *
FROM ProductionOptions po
LEFT JOIN ProductionOrderDetailsOptions o on po.optionType = o.optionType
AND po.optionValue = o.optionValue
AND o.orderNo = '000001'
AND o.detailKey = 1
WHERE po.optionType = 'PACKAGING'

这是我想要的结果: 期望的输出

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

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

4

2 回答 2

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);
}
于 2013-07-25T18:26:33.270 回答
0

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

(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, ...}
 )
于 2017-06-14T06:56:20.710 回答