Linq搜索忽略空值。

5

如何创建一个linq搜索,忽略null(或可null)的值?

我有一个方法

IEnumerable<X> Search(int? a, int? b, int? c)

我希望它能返回任何不为空的整数的匹配结果。

例如:如果ac有值1和9,而b为null,则搜索应该(大致)呈现为:

SELECT * 
FROM [TABLE]
WHERE a = 1
AND c = 9

我的真正方法将有5个以上的参数,所以迭代组合是不可取的。

2个回答

5
IEnumerable<X> query = items;
if (a.HasValue) {
    query = query.Where(x => x.a == a.Value)
}
if (b.HasValue) {
    query = query.Where(x => x.b == b.Value)
}
if (c.HasValue) {
    query = query.Where(x => x.c == c.Value)
}

4
var result = from row in table 
where (!a.HasValue || row.a == a.Value)
&& (!b.HasValue || row.b == b.Value)
&& (!c.HasValue || row.c == c.Value)
select row;

你测试过这个吗?当我尝试枚举结果时,我得到了一个“InvalidOperationException”异常。 - C. Ross
你有更多关于错误的细节吗?错误信息是什么? - David Morton
@David {"可空对象必须具有值。"} - C. Ross
除非您编写查询有误,否则不可能发生这种情况。如果每个“or”组的前半部分被评估为真,则不应调用后半部分。您确定已将“!”放在正确的行之前吗?此外,您是否验证每个组使用一个变量,而不是像这样的内容:(!a.HasValue || row.a == b.Value)? - David Morton
@David 我再次确认了,但不是这种情况。所有行都被否定,并且在内部一致 (a,a,a)。 - C. Ross
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接