EF6 在单次调用中获取计数

EF6 Getting Count In Single Call

尝试执行一次数据库调用以获取一个实体,以及相关子实体的数量。

我知道我可以使用

检索计数
var count = Context.MyChildEntitySet.Where(....).Count();

甚至 MyEntity.ListNavigationProperty.Count()

但这意味着首先获取实体,然后进行另一个调用以获取计数或使用将检索相关实体的整个列表的包含。

我想知道是否可以将 SQL 服务器中的 "Computed" 列添加到 return 另一个 table 中相关行的计数?

如果不是,我如何要求 EF 在一次调用中检索每个实体的相关计数?

我正在考虑将 Join 与 GroupBy 结合使用,但这看起来很丑 solution/hack。

public class MyEntity
{
    public uint NumberOfVotes{ get; private set; }
}

理想情况下会生成 SQL 类似于:

SELECT 
     *, 
     (SELECT Count(*) FROM ChildTable c WHERE c.ParentId = p.Id) NumberOfVotes
FROM ParentTable p

已更新

您始终可以按以下方式使用实际 SQL...

string query = "SELECT *, 
                       (SELECT Count(*) FROM ChildTable c 
                       WHERE c.ParentId = p.Id) as NumberOfVotes
                FROM ParentTable p";

RowShape[] rows = ctx.Database.SqlQuery<RowShape>(query, new object[] { }).ToArray();

我意识到这并不理想,因为这样您就依赖于目标数据库的 SQL 方言。如果您将表单 SQL 服务器移动到其他服务器,那么您将需要检查并可能修改您的字符串。

RowShape class 定义了与 ParentTable 匹配的属性以及一个额外的 属性 称为 NumberOfVotes 的计算计数。

还有一个可能的解决方法。