尝试进行单个数据库调用以获取实体,以及相关子实体的数量。
我知道我可以使用
检索计数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
答案 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类。
仍然是一种可能的解决方法。