[英]EF Core - how to select count from child table based on foreign key
TableB
有一個字段TableAId
,它鏈接到TableA
的Id
。 我想根據TableAId
從TableB
選擇計數,例如 -
SELECT *,
(SELECT COUNT(*) FROM tableB where tableB.TableAId = tableA.Id) as count
FROM tableA
到目前為止,我有代碼:
var data = _context.TableA.AsQueryable();
...
data = data.Select(l => l.TableAId= p.Id).Count();
但在最后一行, p 不被識別為變量。
我如何使這項工作?
編輯 :
我的原始查詢非常復雜並且已經過濾了數據
var data = _context.TableA.AsQueryable();
data = data.Include(p => p.SomeClassA)
.Include(p => p.SomeClassB);
data = data.Where(p => p.Id == somevalue);
data = data.Where(p => p.SomeClassA.Name.Contains(someothervalue));
data = data.Where(p => p.SomeClassA.SomeField.Contains(yetanothervalue));
我嘗試添加它,但它無法編譯(TableAId & Count 不存在):
data = data.Join(
_context.TableB,
groupByQuery => groupByQuery.TableAId ,
TableA => TableA.Id,
(groupByQuery, TableAItem) => new
{
TableAId = groupByQuery.Id,
Count = groupByQuery.Count,
TableAItem = TableAItem
}
);
如果您只是對計數感興趣,請執行以下操作:
var data = _context.TableB.AsQueryable();
var groupByCountQuery = data.GroupBy(a=>a.TableAId, (tableAId, tableBItems) => new
{
TableAId = tableAId,
Count = tableBItems.Count()
});
var result = groupByCountQuery.ToList(); // or change to ToListAsync()
這將為您提供基於 TableAId 的計數。
如果結果中還需要 tableA 項目,則可以執行以下操作:
var groupByCountQuery = data.GroupBy(a=>a.TableAId, (tableAId, tableBItems) => new
{
TableAId = tableAId,
Count = tableBItems.Count()
}).Join(_context.TableA,
groupByQuery => groupByQuery.TableAId,
tableA => tableA.Id,
(groupByQuery , tableA) => new {
TableAId = groupByQuery.TableAId,
Count = groupByQuery.Count,
TableAItem = tableA
} );
假設TableA
具有屬性 - Id、FieldA1 和 FieldA2。
首先,您必須在查詢中包含TableB
以便您可以獲取其計數,例如 -
var data = _context.TableA.Include(p=> p.TableB).AsQueryable();
然后在Select
方法中,您必須使用TableA
的屬性和TableB
的計數創建一個新對象,例如 -
var list = data.Select(p =>
new
{
Id = p.Id,
A1 = p.FieldA1,
A2 = p.FieldA2,
Count = p.OrderLines.Count
}).ToList();
注意,這被分配給一個新的變量list
。 那是因為它不返回TableA
的列表,而是返回具有屬性的匿名對象的列表 - Id、A1、A2 和 Count。 因此,您不能將其分配給先前聲明的data
變量,因為data
的類型為IQueryable<TableA>
。
或者,您可以聲明一個類來保存數據值,例如 -
public class MyData
{
public int Id { get; set; }
public string A1 { get; set; }
public string A2 { get; set; }
public int Count { get; set; }
}
並像使用它一樣 -
var list = data.Select(p =>
new MyData
{
Id = p.Id,
A1 = p.FieldA1,
A2 = p.FieldA2,
Count = p.OrderLines.Count
}).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.