【问题标题】:Sums in the same table with linq lambda expression使用 linq lambda 表达式在同一个表中求和
【发布时间】: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


【解决方案1】:

您可以使用projections 从您的列表中选择和格式化多种数据(TotalQuantityQtyAvailable)。这是您的问题的一个工作示例:

var products = Context.Stocks.GroupBy(s => s.ProdCode)
                             .Select(s => new
                             {
                                 ProdCode = s.Key,
                                 TotalQuantity = s.Sum(o => o.Qty),
                                 QtyAvailable = s.Where(o => o.StockInternalStatus == "Available").Sum(o => o.Qty)
                             });

【讨论】:

    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2023-03-12
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多