[英]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.