1

这是我的 linq 查询。

var data =
  (from obj in lstEventsDataForGrid
   where obj.strDateCode.Contains(thisWeekend[0] == null ? "" : thisWeekend[0])
         || obj.strDateCode.Contains(thisWeekend[1] == null ? "$" : thisWeekend[1])
         || obj.strDateCode.Contains(thisWeekend[2] == null ? "$" : thisWeekend[2])
            && strArr.Contains(obj.strEventType.ToString().ToUpper())
   orderby obj.dtmStartDate ascending
   select obj).GroupBy(x => x.strEventCode)
              .Select(y => y.First()).ToArray();

预期结果

strEventType 是否不在 strArr 中不应该出现。

但即使该类型不在数组中,它也会到来。

我注意到的问题是,如果我删除了一个 where 条件,即obj.strDateCode.Contains(...)另一个条件正在工作。

我哪里错了?请提出一些建议!

4

3 回答 3

3

您的where谓词包含错误:

obj.strDateCode.Contains(thisWeekend[0] == null ? "" : thisWeekend[0])
|| obj.strDateCode.Contains(thisWeekend[1] == null ? "$" : thisWeekend[1])
|| obj.strDateCode.Contains(thisWeekend[2] == null ? "$" : thisWeekend[2]) 
&& strArr.Contains(obj.strEventType.ToString().ToUpper())

这是以下形式的表达式:

where Condition1 || Condition2 || Condition3 && Condition4.

在 C# 中,&&运算符优先于||运算符,所以这相当于

where Condition1 || Condition2 || (Condition3 && Condition4).

在这种情况下,仅当 Condition3 为真时才评估 Condition4。如果 Condition1 或 Condition2 为真,则整个谓词将返回真,表达式的其余部分将短路。

你可能想要的是:

where (Condition1 || Condition2 || Condition3) && Condition4

或者,扩展到您的示例:

(obj.strDateCode.Contains(thisWeekend[0] == null ? "" : thisWeekend[0])
 || obj.strDateCode.Contains(thisWeekend[1] == null ? "$" : thisWeekend[1])
 || obj.strDateCode.Contains(thisWeekend[2] == null ? "$" : thisWeekend[2]) 
) && strArr.Contains(obj.strEventType.ToString().ToUpper())

这将确保如果 an不包含在中,obj则不会返回它, 您的问题表明这是必需的结果。strArr

于 2013-05-23T11:20:56.197 回答
3

我认为你缺少一些括号。你的意思是对待三个|| 条件作为一种选择?如在

where (A || B || C) && D

尝试在where此处放置一个:

where (obj.strDateCode.Contains(thisWeekend[0]

还有第二个:

: thisWeekend[2]))
于 2013-05-23T11:14:24.817 回答
3

我使用 null-coalesce 运算符重写了您的查询,以使其更具可读性。我还添加了行号来指出我认为这里有什么问题:

1.     var data = (
2.         from obj in lstEventsDataForGrid
3.         where obj.strDateCode.Contains(thisWeekend[0] ?? "") ||
4.              obj.strDateCode.Contains(thisWeekend[1] ?? "$") ||
5.              obj.strDateCode.Contains(thisWeekend[2] ?? "$") &&
6.              strArr.Contains(obj.strEventType.ToString().ToUpper())
7.         orderby obj.dtmStartDate ascending
8.         select obj
9.         ).GroupBy(x => x.strEventCode).Select(y => y.First()).ToArray();

您需要更改以下几行:

3.         where (obj.strDateCode ...          // add '('
5.         ... thisWeekend[2] ?? "$")) &&      // add ')'

这样,你的&&意志就会压倒其余的条件。

于 2013-05-23T11:18:27.063 回答