【问题标题】:LINQ with just a where clause or where plus Any clause?LINQ 只有 where 子句还是 where plus Any 子句?
【发布时间】:2019-08-28 03:49:34
【问题描述】:

我想知道哪些 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();

【问题讨论】:

  • 我认为您的右括号在第二个示例中的位置错误。此外,您可能希望在第二个示例中将 StartDate 子句括在括号中..
  • @RufusL 也许是return FamilyList.Any(c => c.Persons.Any(p => p.Person.PersonID == sepecificPersonId) && (c.StartDate == null || c.StartDate > specificDate));
  • 这两个都不能编译,除非您在 LINQ 查询中使用不需要 in 的语言版本,而在第二个版本中 cp 在您使用时不存在检查cp.StartDate
  • @JeppeStigNielsen 好点。在第二个示例中,它将人员开始日期 (cp.StartDate) 与 null 和家庭开始日期 (c.StartDate) 与 specificDate 进行比较,所以有点令人困惑。
  • 对不起,我编辑的时候不小心。我都更新了它们

标签: c# linq


【解决方案1】:

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

建议:以上查询为混合查询,有lamda和查询表达式,请只使用lamda表达式以保持代码一致性

【讨论】:

  • 好吧,我同意只使用 lambda 表达式和代码一致性,但是当你有一个 SQL AND 语句时,它们会按顺序计算,并且这两个 linq 语句都有两个按顺序计算的子句。没有逻辑上的区别,但是这两者有处理上的区别吗?
  • 这个答案不正确。这完全取决于 Linq 提供程序如何运行查询 - 如果它正在生成 SQL,那么即使它确实产生了冗余的 WHERE 子句,任何半体面的 RDBMS 都会将条件合并在一起。如果它在内存中运行(Linq-to-Objects),那么它不一定会被优化(取决于 JIT),但计算复杂度是相同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
相关资源
最近更新 更多