这是我的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();
预期结果
strErr是否不在strArr中,不应该出现。
但即使该类型不在数组中也会出现。
问题我注意到,如果我删除了一个条件,即obj.strDateCode.Contains(...)
其他条件正在运行。
我哪里错了?请提出建议!
答案 0 :(得分:3)
我认为你错过了一些括号。你的意思是对待三个||条件作为一种选择?如在
where (A || B || C) && D
尝试在where
之后放一个:
where (obj.strDateCode.Contains(thisWeekend[0]
和第二个:
: thisWeekend[2]))
答案 1 :(得分: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 ')'
这样,您的&&
将胜过其他条件。
答案 2 :(得分: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为真,则整个谓词将返回true,表达式的其余部分将短路。
你可能想要的是:
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())
如果obj
中未包含strArr
,这将确保不会返回{{1}}
您的问题表明是必需的结果。