【发布时间】:2018-09-27 20:41:15
【问题描述】:
我是使用 LINQ lambda 表达式的新手,我必须在一个名为 stock 的表中进行查询,它具有属性(id、prodId、prodCode、Quantity、StockInternalStatus、位置),StockInternalStatus 可以可用或不可用,我想要做的是获得一个列表,其中包含每个产品的总数量和总可用数量,这意味着,如果我有以下库存:
Stock1: prodCode = A; Qty = 1; StockInternalStatus = Available; Location = sd1
Stock2: prodCode = A; Qty = 2; StockInternalStatus = Not Available; Location = sd2
Stock3: prodCode = B; Qty = 2; StockInternalStatus = Available; Location = sd3
Stock4: prodCode = B; Qty = 2; StockInternalStatus = Available; Location = sd4
结果应该是:
prodCode = A; TotalQuantity = 3; QtyAvailable = 1
prodCode = A; TotalQuantity = 4; QtyAvailable = 4
有人可以帮帮我吗?我已经打了 3 天的代码并进行了测试,但它不起作用。这是我制作的代码:
Context.Stocks.Where(e=>e.IsActive /*&& ( e.ProductCode=="63149")*/)
.GroupBy(s=>s.ProductCode)
.SelectMany(gr=>gr.Select(st=>new
{
TotalQuantity = gr.Sum(c=>c.Quantity),
Count = gr.Count(),
Pr= st.ProductCode,
PrId = st.ProductId,
StockInternalStatus = st.StockInternalStatus
}))
//.Distinct()
.GroupJoin
(Context.Stocks.Where(p=>p.StockInternalStatus=="Available" && p.IsActive)
, ss => ss.PrId, sss => sss.ProductId,
(ss,sss) => new { TotalQuantity = ss.TotalQuantity, ProductCode = ss.Pr,
QtyAvailable = sss.Sum(a=>a.Quantity)
})
.Distinct()
.DefaultIfEmpty()
如果我指定产品代码,它会给我该产品的结果,但如果我想获得所有产品的结果,我会收到以下错误:
错误:转换为值类型“System.Decimal”失败,因为具体化值为空。结果类型的泛型参数 或者查询必须使用可为空的类型。
据我了解,此错误是第一次咨询中的某些产品在使用第二次进行 GroupJoin 时不会出现,因为它们不可用,因为我只取出第二次可用的产品,我感兴趣的是获取可用的总数,但我不确定我是否理解得很好。
感谢您的帮助。
【问题讨论】:
-
您的示例代码中的
PrId是什么,但您的示例表中没有?GroupJoin试图完成什么?
标签: linq