2014-10-17 72 views
0

我想知道如何有效计数(SQL服务器端)具有多个相关实体的特定范围的结果的不同计数的数量到很多关系。高效计算EF中多对多关系实体的方法

这是目前的情况中实体框架:

表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服务器直接返回计数。 由于多对多关系(表3)的额外表已消失,因此在查询语法中将此查询转换为L2E时出现问题。 (因为我不能通过内部连接将表4连接到表2)。

我有这种链式语法,但是,这是有效的(这是否获取整个列表,或它是否让SQLserver做计数,因为我不知道这是一种有效的方式来选择,表2包含约收3万词条,我不希望它取这个结果只是来算的话):

context.Table4.Where(a => a.Table2.Any(v => v.Table1Id > 200000)).Select(a => aTable4Id).Distinct().Count(); 

我将如何去转换LINQ2SQL查询到L2E在查询语法?或者在这种情况下链接的语法很好?

+0

导航属性在哪里? ('Table1.Table2s'等) – 2014-10-17 11:38:57

+0

在EF: Table1.Table2 Table2.Table4 Table2.Table1 Table4.Table2 Table4.Table4 – snovvdog 2014-10-17 12:02:01

+0

在'join'代替所以使用这些。 – 2014-10-17 12:53:19

回答

0

.Select()方法uses deferred execution,这意味着它不会真正运行查询,直到您需要结果。在链中的那一点,它仍然只存在于查询定义中。然后在.Count()之前用.Distinct()修改 - 它使用SQL GROUP BY语句来查询数据库。所以你应该很好。