我已经仔细考虑了使用多个条件将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'
以下是我想要的结果:
表面上我想将LINQ结果绑定到像GridView这样的对象。
如果你走到这一步,我想感谢你的耐心......
答案 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, ...}
)