选择带孩子的记录的有效方法?

时间:2011-06-30 16:23:40

标签: c# linq-to-sql

我有一个LINQ to SQL查询,类似于以下内容......

return from parent in Context.Parents
       where 
       (
          (parent.SomeProperty != null && parent.SomeProperty != "")
          ||
          (Context.Childs.Count(c => c.ParentID == parent.ID && c.Type == "SomeType") > 0)
       )
       select parent

我的想法是,我想找到所有已获得“SomeProperty”值或具有“SomeType”类型的子记录的父记录。

问题是查询超时。是否有更快(但仍易于阅读)的方式做同样的事情?

感谢阅读。

1 个答案:

答案 0 :(得分:4)

使用Any()代替Count()

return from parent in Context.Parents
       where 
       (
          (parent.SomeProperty != null && parent.SomeProperty != "")
          ||
          Context.Childs.Any(c => c.ParentID == parent.ID 
                                  && c.Type == "SomeType")
       )
       select parent;

在Linq to SQL中Count(<some condition>)被翻译成:

SELECT COUNT(*) WHERE <some condition>

查询需要迭代数据库中的所有行才能找到计数。

在Linq to SQL中Any(<some condition>)被翻译为

EXISTS (.. <some condition>)

子查询,它允许在找到第一个匹配项后短路结果。

可以在此SO答案中找到确切的SQL映射:query result what should i use Count() or Any()