EF6在单个呼叫中获取计数

时间:2015-02-18 00:24:31

标签: c# sql entity-framework entity-framework-6 entity-relationship

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

我知道我可以使用

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

甚至是MyEntity.ListNavigationProperty.Count()

但是这意味着首先获取实体,然后再进行另一次调用以获取计数或使用Include来检索整个相关实体列表。

我想知道是否可以添加" Computed" SQL Server中的列返回另一个表中相关行的Count?

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

我正在考虑使用Join with GroupBy,但这似乎是一个丑陋的解决方案/黑客。

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

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

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

1 个答案:

答案 0 :(得分:1)

<强>已更新

您总是可以通过以下方式下拉到使用实际的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 Server移动到其他位置,那么您需要检查并修改字符串。

使用与ParentTable匹配的属性以及具有计算数量的名为NumberOfVotes的额外属性定义RowShape类。

仍然是一种可能的解决方法。