Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF Core-如何基于外键从子表中选择计数_Entity Framework_Asp.net Core - Fatal编程技术网

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