簡體   English   中英

從單個 linq 中的多個表中獲取計數

[英]Get Count from multiple table in single linq

我正在尋找 linq 查詢來計算單個查詢中具有相同 ID 的多個表的記錄。

表 1:訂單

OID 供應商 ID 供應商名稱 日期 地位
1 34 拉斯 2022-09-01 積極的
2 33 泰克 2022-09-02 處理
3 34 拉斯 2022-09-01 積極的
4 45 2022-09-05 積極的
5 57 2022-09-07 處理

表 2:訂閱

SID 供應商 ID 訂閱包 日期 地位
1 34 粘性物 2022-09-01 積極的
2 34 2022-09-01 處理
3 35 2022-09-04 積極的

表 3:注釋

NID 供應商 ID NoteDesc 日期 地位
1 34 IIT 2022-09-01 積極的
2 34 尼特 2022-09-01 積極的
3 34 成套工具 2022-09-01 積極的
4 26 點燃 2022-09-03 積極的
5 74 2022-09-04 處理

我想計算上面的表記錄,其中 vendorID = 34 和 Date = '2022-09-01' 和 Status = 'Active'。

截至目前,我在每個單獨的查詢中都得到了計數

var OCount = Orders.Where(a=> a.VendorID = 34 && a.Date = '2022-09-01' && a.Status = 'Active').ToCount();

var SCount = Subscribe.Where(a=> a.VendorID = 34 && a.Date = '2022-09-01' && a.Status = 'Active').ToCount();

var NCount = Notes.Where(a=> a.VendorID = 34 && a.Date = '2022-09-01' && a.Status = 'Active').ToCount();

所以我得到 output 為,

OCount:2 SCount:1 NCount:3

我正在尋找一個 linq 查詢來計算所有記錄。

提前致謝

通過常量使用已知技術GroupBy ,然后使用Concat結果集:

var OCount = Orders.Where(a => a.VendorID == 34 && a.Date == "2022-09-01" && a.Status == "Active")
    .GroupBy(x => 1).Select(g => g.Count());

var SCount = Subscribe.Where(a => a.VendorID == 34 && a.Date == "2022-09-01" && a.Status == "Active")
    .GroupBy(x => 1).Select(g => g.Count());

var NCount = Notes.Where(a => a.VendorID == 34 && a.Date == "2022-09-01" && a.Status == "Active")
    .GroupBy(x => 1).Select(g => g.Count());

var result = OCount.Concat(SCount).Concat(NCount).Sum();

此查詢將生成大約以下 SQL(如果您使用的是 EF):

SELECT SUM(s.count)
FROM (
    SELECT COUNT(*) as count
    FROM Orders o
    WHERE o.VendorID = 34 AND o.Date = '2022-09-01' AND o.Status = 'Active'
    UNION ALL
    SELECT COUNT(*) as count 
    FROM Subscribe s
    WHERE s.VendorID = 34 AND s.Date = '2022-09-01' AND s.Status = 'Active'
    UNION ALL
    SELECT COUNT(*) as count
    FROM Notes n
    WHERE n.VendorID = 34 AND n.Date = '2022-09-01' AND n.Status = 'Active'
) s

如果使用相同的表列類型:

int result = Orders.Concat(Subscribe).Concat(Notes).Count(a => a.VendorID == 34 && a.Date == "2022-09-01" && a.Status == "Active");

不同的類型:

int result = Orders.Select(x => new { x.VendorID, x.Date, x.Status }).Concat(
          Subscribe.Select(x => new { x.VendorID, x.Date, x.Status })).Concat(
              Notes.Select(x => new { x.VendorID, x.Date, x.Status }))
         .Where(x => x.VendorID == 34 && x.Date == "2022-09-01" && x.Status == "Active").Count();

也許您可以 select 從不同的表中的公共字段,然后應用相同的過濾器:

int totalCount = Orders
    .Select(x => (x.VendorID, x.Date, x.Status))
    .Concat(Subscribe.Select(x => (x.VendorID, x.Date, x.Status)))
    .Concat(Notes.Select(x => (x.VendorID, x.Date, x.Status)))
    .Count(x => x.VendorID == 34 && x.Date == "2022-09-01" && x.Status == "Active");

如果您的 EF 版本不支持帶有條件的計數,請使用Where(condition).Count()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM