Linq 使用其他查询中的值更新现有列表值

Linq 使用其他查询中的值更新现有列表值,linq,Linq,我有一个linq语句,它调用一个存储过程并返回一个项目和描述列表 就这样, var q=doh.usp\u Report\u PLC()中的i 其中i.QTYGood==0 orderby i.零件号 选择新零件(){PartNumber=i.PartNumber,Description=i.Description.TrimEnd()} 然后我有另一个SQL语句,它返回每个项目的订单数量和交货日期。Parts类还有两个其他属性来存储这些属性。如何使用其他两个值更新现有明细栏,以便有一个明细栏包含

我有一个linq语句,它调用一个存储过程并返回一个项目和描述列表

就这样,

var q=doh.usp\u Report\u PLC()中的i
其中i.QTYGood==0
orderby i.零件号
选择新零件(){PartNumber=i.PartNumber,Description=i.Description.TrimEnd()}

然后我有另一个SQL语句,它返回每个项目的订单数量和交货日期。Parts类还有两个其他属性来存储这些属性。如何使用其他两个值更新现有明细栏,以便有一个明细栏包含所有四个值

更新

下面的代码现在显示结果

                var a = from a1 in db.usp_Optos_DaysOnHand_Report_PLC()
                    where a1.QTYGood == 0
                    orderby a1.PartNumber
                    select new Parts() { PartNumber = a1.PartNumber, Description = a1.Descritpion.TrimEnd() };

            var b = from b1 in db.POP10110s
                    join b2 in db.IV00101s on b1.ITEMNMBR equals b2.ITEMNMBR
                    //from b3 in j1.DefaultIfEmpty()
                    where b1.POLNESTA == 2 && b1.QTYCANCE == 0
                    group b1 by new { itemNumber = b2.ITMGEDSC } into g
                    select new Parts() { PartNumber = g.Key.itemNumber.TrimEnd(), QtyOnOrder = g.Sum(x => Convert.ToInt32(x.QTYORDER)), DeliveryDue = g.Max(x => x.REQDATE).ToShortDateString() };

            var joinedList = a.Join(b,
                    usp => usp.PartNumber,
                    oss => oss.PartNumber,
                    (usp, oss) =>
                         new Parts
                         {
                             PartNumber = usp.PartNumber,
                             Description = usp.Description,
                             QtyOnOrder = oss.QtyOnOrder,
                             DeliveryDue = oss.DeliveryDue
                         });

            return joinedList.ToList();
假设您的“其他SQL语句”返回
零件号
数量
交货日期
,您可以将列表合并为一个:

var joinedList = q.Join(OtherSQLStatement(), 
                        usp => usp.PartNumber,
                        oss => oss.PartNumber,
                        (usp, oss) => 
                             new Parts
                                    {
                                        PartNumber = usp.PartNumber,
                                        Description = usp.Description,
                                        Quantity = oss.Quantity,
                                        DeliveryDate = oss.DeliveryDate
                                    }).ToList();
实际上,您可以组合查询,并在一个联接和投影中执行此操作:

var joinedList = doh.usp_Report_PLC().
                     Where(i => i.QTYGood == 0).
                     OrderBy(i => i.PartNumber).
                     Join(OtherSQLStatement(), 
                          i => i.PartNumber,
                          o => o.PartNumber,
                          (i, o) => 
                               new Parts
                                    {
                                        PartNumber = i.PartNumber,
                                        Description = i.Description,
                                        Quantity = o.Quantity,
                                        DeliveryDate = o.DeliveryDate
                                    }).ToList();
同样:我假设您在两个返回的集合中都有
PartNumber
,以确定哪个项属于哪个项

编辑

在这种情况下,LINQ查询语法可能更具可读性:

var joinedList = from aElem in a
                 join bElem in b
                 on aElem.PartNumber equals bElem.PartNumber into joinedAB
                 from abElem in joinedAB.DefaultIfEmpty()
                 select new Part
                            {
                                PartNumber = aElem.PartNumber,
                                Description = aElem.Description,
                                DeliveryDue = abElem == null ? null : abElem.DeliveryDue,
                                QtyOnOrder = abElem == null ? null : abElem.QtyOnOrder
                            };
您的
DeliveryDue
QtyOnOrder
可能为空。如果不是,则用默认值替换空值。例如,如果您在
b
中没有元素,并且希望
QtyOnOrder
在结果列表中为
0
,请将行更改为

QtyOnOrder = abElem == null ? 0 : abElem.QtyOnOrder

我是用实际的Linq查询替换OtherSQLStatement(),还是将Linq查询放在另一个名为OtherSQLStatement()的函数中,然后从该函数返回结果;var j=从doh.POP10110s中的a开始,其中a.ITEMNMBR.StartsWith(“PARTNUMBER”)&&a.POLNESTA==2&&a.QTYCANCE==0组a通过新的{itemname=a.ITEMNMBR}转换为g选择新零件(){PARTNUMBER=g.Key.itemNumber,QtyOnOrder=g.Sum(x=>Convert.ToInt32(x.QTYORDER)),OrderExpected=g.Max(x=>x.REQDATE)};要检查它是否有效,您可以先加入
q
j
。将第一个(最顶层)解决方案中的
OtherSQLQuery()
替换为
j
。如果它确实如预期的那样工作,我将编辑我的答案,并包括一个包含所有内容的大型查询。谢谢。我已经编辑了我的原始帖子,但不幸的是,上面的代码没有返回任何结果。我和上一篇帖子有同样的问题。我尝试了托马斯·列维斯式的解决方案,但似乎也不起作用。