2

这很奇怪。

下面的代码抛出一个Object reference not set to an instance of an object

var members = db.Members.Where(
    a => 
        String.IsNullOrEmpty(searchEmail) 
            || (a.Email ?? "").ToUpper().Contains(searchEmail.ToUpper()));

其中db是 aDataContext并且searchEmail是字符串,在本例中设置为null

代码应该全部返回,Members因为前半部分||返回 true,但是,我得到了上述异常。

奇怪的是,如果我将代码更改为:

var members = db.Members.Where(
    a => 
        String.IsNullOrEmpty(searchEmail) 
            || (a.Email ?? "").ToUpper().Contains((searchEmail ?? "").ToUpper()));

不抛出异常!据推测,这意味着它在明确String.IsNullOrEmpty评估false时正在评估true,除非有一些关于IQueryable' 的实施Where


更新

哈比卜的回答是正确的。对于阅读本文的其他人,我解决 Habib 解释的限制的解决方案是:

var members = db.Members.AsQueryable();

if (!String.IsNullOrEmpty(searchEmail))
    members = members.Where(a => a.Email.ToUpper()
                        .Contains(searchEmail.ToUpper()));
4

1 回答 1

4

此 LINQ 表达式转换为 SQL 查询,它不会 按预期进行短路。这就是为什么你得到例外。

SQL-CLR 类型不匹配

C# 根据逻辑运算符 && 和 || 的操作数的词法顺序指定短路语义。另一方面,SQL 针对基于集合的查询,因此为优化器提供了更多自由来决定执行顺序。

于 2013-10-11T16:49:19.403 回答