ef核心 - 如何根据外国键从子表中选择计数

问题描述 投票:0回答:3
具有与

TableAId

Id
link链相连的字段
TableA
。我想根据
TableB
TableAId
选择
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();

到目前为止,我有代码:

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));

但在最后一行,p并未被识别为变量。
我如何做这项工作?

Edit:

我的原始查询是安静的复杂,已经过滤数据 data = data.Join( _context.TableB, groupByQuery => groupByQuery.TableAId , TableA => TableA.Id, (groupByQuery, TableAItem) => new { TableAId = groupByQuery.Id, Count = groupByQuery.Count, TableAItem = TableAItem } );

我尝试添加它,但无法编译 (tableaid&Count不存在):


    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()

如果您只是对计数感兴趣,那么请执行以下操作:
c# linq asp.net-core entity-framework-core
3个回答
1
投票

这将为您提供基于tableaid的计数。

如果您在结果中也需要表面处理,则完成CA之后:
TableA

llet Say

TableB
具有属性-ID,fielda1和fielda2。
首先,您需要在查询中包含
var data = _context.TableA.Include(p=> p.TableB).AsQueryable();

1
投票

Select

然后在

TableA

方法中,您需要创建一个具有

TableB
的属性及其子女计数的新对象,例如-

var list = data.Select(p =>
new
{
    Id = p.Id,
    A1 = p.FieldA1,
    A2 = p.FieldA2,
    Count = p.TableB.Count
}).ToList();
notice,将其分配给一个新的变量

list

。那是因为它不会返回
TableA
列表,而是返回具有属性的匿名对象列表-ID,A1,A2和计数。因此,您不能将其分配给先前声明的
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.TableB.Count
}).ToList();
    
如果您想从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();

逆转:

    

0
投票
© www.soinside.com 2019 - 2025. All rights reserved.