簡體   English   中英

EF Core - 如何根據外鍵從子表中選擇計數

[英]EF Core - how to select count from child table based on foreign key

TableB有一個字段TableAId ,它鏈接到TableAId 我想根據TableAIdTableB選擇計數,例如 -

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 開始,可以使用以下 linq 查詢:

var data = _context.TableAs.AsQueryable();

        var x = (from a in data
                 join b in _context.TableBs on a.Id equals b.TableAId
                 group a.TableB by a.Id into g
                 select new
                 {
                     TableAId = g.Key,
                     TableBItem = g.FirstOrDefault(),
                     Count = g.Count()
                 }).ToList();
                 

結果: 在此處輸入圖片說明

假設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.

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