对象引用未设置为LINQ to SQL的对象奇怪行为的实例

时间:2013-10-11 16:44:43

标签: c# linq-to-sql iqueryable

这非常离奇。

以下代码抛出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()));

其中dbDataContextsearchEmail是一个字符串,在这种情况下设置为null

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

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

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

没有异常被抛出!据推测,这意味着String.IsNullOrEmpty在评估false时正在评估true,除非有IQueryable Where的{​​{1}}实施内容?


更新

Habib's answer is correct。对于阅读此内容的其他人,我解决Habib解释的限制的解决方案是:

var members = db.Members.AsQueryable();

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

1 个答案:

答案 0 :(得分:4)

此LINQ表达式转换为SQL Query,不会按预期进行短路。这就是你得到例外的原因。

SQL-CLR Type Mismatches

  

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