这非常离奇。
以下代码抛出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
是DataContext
,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
的{{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()));
答案 0 :(得分:4)
此LINQ表达式转换为SQL Query,不会按预期进行短路。这就是你得到例外的原因。
C#指定基于词汇顺序的短路语义 逻辑运算符的操作数&&和||。另一方面SQL就是 针对基于集合的查询,因此提供了更多的自由 优化器决定执行顺序。