我有一个查询,它必须对几个表中的值求和并添加结果。该系统只是一个库存系统,我试图通过计算进货 ( deliveries
)、支出 ( issues
) 和adjustments
项目来获取库存水平。
由于库存水平是一个计算值(sum(deliveries) - sum(issues)) + sum(adjustments)
,我正在尝试创建一个函数,该函数将以最少的查询次数获得该值。
目前我有 linq 执行三个单独的查询来获取每个求和值,然后在我的函数中执行加法/减法,但是我相信必须有更好的方法来计算值而不必执行三个单独的查询。
当前功能如下:
public static int GetStockLevel(int itemId)
{
using (var db = EntityModel.Create())
{
var issueItemStock = db.IssueItems.Where(x => x.ItemId == itemId).Sum(x => x.QuantityFulfilled);
var deliveryItemStock = db.DeliveryItems.Where(x => x.ItemId == itemId).Sum(x => x.Quantity);
var adjustmentsStock = db.Adjustments.Where(x => x.ItemId == itemId).Sum(x => x.Quantity);
return (deliveryItemStock - issueItemStock) + adjustmentsStock;
}
}
在我看来,SQL 查询非常简单,所以我考虑了一个存储过程,但是我认为必须有一种方法可以用 linq 做到这一点。
非常感谢
编辑:回答
从 Ocelot20 的答案中获取代码,稍作改动。每个let
s 都可以返回 null,如果返回,则 linq 抛出异常。使用该DefaultIfEmpty
命令将否定这一点,并返回 0 进行最终计算。我使用的实际代码如下:
from ii in db.Items
let issueItems = db.IssueItems.Where(x => x.ItemId == itemId).Select(t => t.QuantityFulfilled).DefaultIfEmpty(0).Sum()
let deliveryItemStock = db.DeliveryItems.Where(x => x.ItemId == itemId).Select(t => t.Quantity).DefaultIfEmpty(0).Sum()
let adjustmentsStock = db.Adjustments.Where(x => x.ItemId == itemId).Select(t => t.Quantity).DefaultIfEmpty(0).Sum()
select (deliveryItemStock - issueItems) + adjustmentsStock);