Entity framework EF Core-如何基于外键从子表中选择计数
Entity framework EF Core-如何基于外键从子表中选择计数,entity-framework,asp.net-core,Entity Framework,Asp.net Core,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.T
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不存在):
如果您只是对计数感兴趣,请执行以下操作:
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的计数
如果您还需要结果中的表格项目,则可以执行以下操作:
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();
结果:
假设
表a
有属性-Id、FieldA1和FieldA2
首先,您必须在查询中包含TableB
,以便可以计算它的数量,如-
var data=_context.TableA.Include(p=>p.TableB.AsQueryable();
然后在选择方法中,您必须使用TableA
的属性和TableB
的计数创建一个新对象,如-
var list=data.Select(p=>
新的
{
Id=p.Id,
A1=p.FieldA1,
A2=p.FieldA2,
Count=p.OrderLines.Count
}).ToList();
注意,这被分配给一个新变量列表
。这是因为它不返回TableA
的列表,而是返回一个匿名对象的列表,其属性为-Id、A1、A2和Count。因此,您不能将其分配给先前声明的data
变量,因为data
属于IQueryable
类型
或者,您可以声明一个类来保存数据值,如-
公共类MyData
{
公共int Id{get;set;}
公共字符串A1{get;set;}
公共字符串A2{get;set;}
公共整数计数{get;set;}
}
像这样使用它-
var list=data.Select(p=>
新MyData
{
Id=p.Id,
A1=p.FieldA1,
A2=p.FieldA2,
Count=p.OrderLines.Count
}).ToList();
这还意味着我必须解析返回的列表,才能将其与上一个查询合并。。。没有办法使用一个查询吗?特别是因为我的主查询是filteringI修改了这个问题(见下),所以在Count=groupByQuery.Count()中缺少括号。Count是一个方法,而不是一个属性。另外,你能提供一点关于如何构造groupByQuery的详细信息吗?好的,但是groupByQuery来自你的代码,我不构造ITI@phil123456,关于这个案例有什么更新吗?
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();