複数のテーブルの値を合計して結果を追加する必要があるクエリがあります。deliveries
このシステムは単純な在庫システムであり、入庫 ( )、出庫 ( issues
)、および品目を計算して在庫レベルを取得しようとしadjustments
ています。
在庫レベルは計算値(sum(deliveries) - sum(issues)) + sum(adjustments)
であるため、最小限のクエリでこの値を取得する関数を作成しようとしています。
現在、3 つの個別のクエリを実行して各合計値を取得し、関数で加算/減算を実行する linq がありますが、3 つの個別のクエリを実行することなく値を計算するためのより良い方法が必要であると確信しています。
現在の機能は次のとおりです。
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 を返す可能性があり、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);