Linq 使用其他查询中的值更新现有列表值
我有一个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类还有两个其他属性来存储这些属性。如何使用其他两个值更新现有明细栏,以便有一个明细栏包含
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
。如果它确实如预期的那样工作,我将编辑我的答案,并包括一个包含所有内容的大型查询。谢谢。我已经编辑了我的原始帖子,但不幸的是,上面的代码没有返回任何结果。我和上一篇帖子有同样的问题。我尝试了托马斯·列维斯式的解决方案,但似乎也不起作用。