C# 只有where子句或where加任何子句的LINQ?

C# 只有where子句或where加任何子句的LINQ?,c#,linq,C#,Linq,我想知道这些LINQ查询中哪一个更有效(以及如何解决这个问题)。一个在where子句中包含所有逻辑,另一个在where子句中包含一半,在Any子句中包含一半。在本例中,数据来自SQL Server。谢谢 return (from c FamilyList where c.Persons.Any(cp => cp.Person.PersonID == specificPersonID) select c).Any(c => c.StartDate == nu

我想知道这些LINQ查询中哪一个更有效(以及如何解决这个问题)。一个在where子句中包含所有逻辑,另一个在where子句中包含一半,在Any子句中包含一半。在本例中,数据来自SQL Server。谢谢

return (from c FamilyList
       where c.Persons.Any(cp => cp.Person.PersonID == specificPersonID)
       select c).Any(c => c.StartDate == null || c.StartDate > specificDate);

return (from c FamilyList
       where c.Persons.Any((cp => cp.Person.PersonID == specificPersonID)
       && (c.StartDate == null || c.StartDate > specificDate)
       select c).Any();

仅对上述查询进行注释。第二个查询是有效的,因为过滤只执行一次。第一个执行两次


建议:上面的查询是混合查询,其中包含lamda和查询表达式。请仅使用lamda表达式来保持代码一致性

我认为第二个示例中的右括号位置错误。另外,您可能希望在第二个示例中将
StartDate
子句包装在括号中。@RufusL可能是
returnfamilyList.Any(c=>c.Persons.Any(p=>p.PersonID==sespecificpersonid)&(c.StartDate==null | | c.StartDate>specificDate))替代?这两个都不能编译,除非您在LINQ查询中使用的是不需要
的语言版本,并且在第二个查询中,当您选中
cp.StartDate
@JeppeStigNielsen Good point时,
cp
不存在。在第二个示例中,它将个人开始日期(
cp.StartDate
)与
null
进行比较,将家庭开始日期(
c.StartDate
)与
specificDate
进行比较,因此有点混淆。对不起,我在编辑时太粗心了。我已经更新了它们,我同意只使用lambda表达式和代码一致性,但是当您有一个SQL和语句时,它们是按顺序计算的,并且这两个linq语句都有两个按顺序计算的子句。没有逻辑上的区别,但是这两者之间有处理上的区别吗?这个答案是错误的。这完全取决于Linq提供程序如何运行查询—如果它正在生成SQL,那么即使它确实生成冗余的
WHERE
子句,任何半体面的RDBMS都会将这些条件合并在一起。如果它在内存中运行(Linq到对象),那么它不一定会被优化(取决于JIT),但计算复杂度是相同的。