在这样的代码中:
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 还是不为 null,都会评估表达式的所有部分。
我正在使用 LINQ to NHibernate
更新:
不幸的是,我把第一个片段弄错了。正确的是:
if (insuranceNumberSearch == null || (insuranceNumberSearch != null && ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim()))
doSomething();
或者
bool b1 = insuranceNumberSearch == null ? true : ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim());
if (b1)
doSomething();
在上述两个 when insuranceNumberSearch
is 中null
,剩余的表达式不再被评估。如果这样的行为不存在,insuranceNumberSearch.Trim()
将导致引用对象为空异常。可悲的是 LINQ(或者可能是 LINQ-to-NHibernate)不遵守如此好的行为并评估所有表达式,即使insuranceNumberSearch
是null
并且导致错误。
更新2:我发现了一个类似的问题:|| (或)使用 C# 的 Linq 中的运算符