C# Count占用了大量的处理时间并降低了性能

C# Count占用了大量的处理时间并降低了性能,c#,asp.net,linq-to-sql,C#,Asp.net,Linq To Sql,Count占用了大量的处理时间并降低了性能 我正在做一个递归循环,对于一个子(我们称之为父)我必须检查它下面的子数量,以决定是否应该包含它 计数太慢8毫秒:(对于120个父记录) 您可以从数据库中选择一个投影,获取父元素及其子元素的计数。这样可以避免往返到数据库 var query = from x in DataContext.Parents select new {Parent = x, Count = x.Childs.Count() }; 现在将结果和下一步想

Count占用了大量的处理时间并降低了性能

我正在做一个递归循环,对于一个子(我们称之为父)我必须检查它下面的子数量,以决定是否应该包含它

计数太慢8毫秒:(对于120个父记录)


您可以从数据库中选择一个投影,获取父元素及其子元素的计数。这样可以避免往返到数据库

var query = from x in DataContext.Parents 
            select new {Parent = x, Count = x.Childs.Count() };
现在将结果和下一步想做的任何事情进行循环

如果您只想基于子元素计数筛选(=where子句),请执行以下操作:

var query = from x in DataContext.Parents 
            where c.Childs.Count() > 10
            select x;

Linq to SQL将尝试将您对
IEnumerable.Count()
的调用转换为
SELECT Count(*)
,这将非常有效。

您可以从数据库中选择一个投影,以获取父元素及其子元素的计数。这样可以避免往返到数据库

var query = from x in DataContext.Parents 
            select new {Parent = x, Count = x.Childs.Count() };
现在将结果和下一步想做的任何事情进行循环

如果您只想基于子元素计数筛选(=where子句),请执行以下操作:

var query = from x in DataContext.Parents 
            where c.Childs.Count() > 10
            select x;

Linq to SQL将尝试将调用转换为
IEnumerable.Count()
SELECT Count(*)
,这应该是相当高的性能。

对我来说,这听起来像是在一个结果集上循环,对每个结果执行另一个Linq到sql查询。在这种情况下,它肯定会很慢,因为您将执行大量额外的数据库往返


您必须重写您的问题,以便在第一次查询中立即将子项计数在一起。

对我来说,这听起来像是在一个结果集上循环,对每个结果执行另一个Linq到sql查询。在这种情况下,它肯定会很慢,因为您将执行大量额外的数据库往返


你必须重写你的问题,以便在第一次查询中立即将子项计数在一起。

你能发布生成的SQL吗?有多少项被计数?你能提供一个你的方法的例子吗?请发布一些代码-如果真实代码太大或无法发布,用同样的行为制作一个小例子viour,这将有助于获得更好的答案。你能发布生成的SQL吗?计算了多少项?你能提供一个例子说明你的方法吗?请发布一些代码-如果真正的代码太大或无法发布,用同样的行为制作一个小例子,这将有助于获得更好的答案。不做其他事情Linq to sql有父实体和子实体集合。在子引用上调用
Count()
,确实是另一个Linq to sql查询(尽管是一个非常简单的查询)这将导致到数据库的另一个sql查询往返。@Johannes Rudolph在他的回答中有一个很好的代码示例,使用
select new
获取父实体和子实体计数。Na不执行另一个Linq to sql,父实体和子实体集合只是调用
count()
在children引用上确实是另一个linq to sql查询(尽管非常简单),它将导致另一个sql查询往返到数据库。@Johannes Rudolph在他的回答中有一个很好的代码示例,使用
select new
获取父实体和子计数。