LINQ嵌套条件

时间:2016-06-21 01:30:32

标签: linq

对不起,我已经搜索了十几个相关帖子,但没有找到我需要的内容......

我想要返回这样的对象:

((Status == 1 || Status == 2) && Value = 'Green')

当然,我无法在Linq中使用括号,因为我可以在SQL中使用括号。我尝试过以下方法:

list.Where(x => x.Status == 1 || x.Status == 2)
    .Where(x => x.Value == 'Green')

// or...
list.Where(x => x.Value == 'Green')
    .Any(x => x.Status == 1 || x.Status == 2)

// or...
list.Where(x => x.Status == 1 || x.Status == 2)
    .Any(x => x.Value == 'Green')

(或其他多种变体)

是否有一种方法"正确"比另一个?

虽然我可以从中扼杀一些结果,但我有两个主要问题:

  1. 这是最受欢迎的最佳做法(如果有的话),
  2. 我的索引首先针对状态谓词进行了优化...... Linq是否足够聪明才能实现这一点,和/或上述某个版本是否确保索引谓词以最佳顺序传播?

1 个答案:

答案 0 :(得分:0)

你的表达应该有效:

.Where(x => (x.Status == 1 || x.Status == 2) && x.Value = 'Green')

备选方案清单中的第一个表达,即

list.Where(x => x.Status == 1 || x.Status == 2)
    .Where(x => x.Value == 'Green')

是它的逻辑等价物。当LINQ转换为某些RDBMS时,这两种方法会产生等效的SQL。当在内存中使用LINQ时,两个Where子句一个接一个地执行,但总体结果是相同的。

备选方案#2和#3不相同,因为Any(...)会产生truefalse,具体取决于结果中是否存在与其谓词匹配的记录。