我想知道如何有效地计算(SQL服务器端)对于具有多对多关系的相关实体的特定范围的结果的不同计数数量。
这是实体框架中的当前情况:
表1 1< ------->∞表2
表2∞< ------->∞表4
表2和表4具有多对多关系,并与SQL中的Table3链接。 我想要的是与Table1的特定范围相关的table4结果的独特计数。
在LinQ to SQL中,查询是这样的:
(from dc in Table1
join vc in Table2 on dc.Table1Id equals vc.Table2Id
join vcac in Table3 on vc.Table2Id equals vcac.Table3Id
join ac in Table4 on vcac.Table3Id equals ac.Table4Id
where dc.Table1Id > 200000
group ac by ac.Table4Id into nieuw
select new { acid= nieuw.Key}).Count()
这使SQL Server可以直接返回计数。 因为多对多关系的额外表(表3)已经消失,所以我在查询语法中将此查询转换为L2E时遇到了问题。 (因为我不能将表2与表2连接到内部连接)。
我使用链式语法,但是,这是有效的(这会获取整个列表,还是让SQLserver进行计数,因为我不确定这是一种有效的选择方式,表2包含大约30.000个条目,我不想让它获取此结果只是为了计算它:)
context.Table4.Where(a => a.Table2.Any(v => v.Table1Id > 200000)).Select(a => aTable4Id).Distinct().Count();
如何在查询语法中将Linq2SQL查询转换为L2E?或者在这种情况下链式语法是否正常?
答案 0 :(得分:0)
.Select()
方法uses deferred execution,这意味着在您需要结果之前,它实际上不会运行查询。在链中的那一点,它仍然仅作为查询定义存在。然后在获得.Distinct()
之前使用.Count()
进行修改 - 它使用SQL GROUP BY语句查询数据库。所以你应该做得很好。