在这样的码:为什么普通法则在评估布尔表达式时不适合LINQ?
if (insuranceNumberSearch == null
? true
: ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim()))
doSomething();
其中insuranceNumberSearch
为空时,剩余的表达不为空,而在下面的代码:
var q = from ei in session.Linq<EmployeeInsurance>()
where insuranceNumberSearch == null
? true
: ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim())
select ei;
不管表达的所有部分被评估insuranceNumberSearch的是null,或者不是空值。
我使用LINQ to NHibernate的
UPDATE:
不幸的是我已经把第一个片段是错误的。正确的是:
if (insuranceNumberSearch == null || (insuranceNumberSearch != null && ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim()))
doSomething();
或
bool b1 = insuranceNumberSearch == null ? true : ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim());
if (b1)
doSomething();
在两种以上时insuranceNumberSearch
是null
,剩余表达式不评估任何更多。如果这种行为不存在,insuranceNumberSearch.Trim()
将导致引用对象为空异常。可悲的是,LINQ(或者LINQ到NHibernate)不服从这样一个好的行为,并且即使在insuranceNumberSearch
是null
并且导致错误时也评估所有表达式。
更新2:我发现了一个类似的问题:The || (or) Operator in Linq with C#
我觉得条件是相同的。也许还有一些地方你可能会寻找错误。你能指定你期望得到什么结果吗?你会得到什么结果? – 2010-02-21 15:27:31
我从来没有尝试Linq2NHiberate,它是否编译IQueryable与表达查询? – 2010-02-21 15:31:40
@Tomas:据我所知,他的“所有部分......被评估”(原文如此)为“没有短路”,这意味着对于'insuranceNumberSearch == null',您最终会在'ei.InsuranceNumber处得到NRE .contains(insuranceNumberSearch.Trim())' – 2010-02-21 15:48:24