为什么评估布尔表达式的普通定律不适合LINQ?

Afs*_*bbi 4 c# linq linq-to-nhibernate

在这样的代码中:

if (insuranceNumberSearch == null 
     ? true  
     : ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim())) 
   doSomething();
Run Code Online (Sandbox Code Playgroud)

where insuranceNumberSearch为null,在以下代码中,其余表达式不为null:

var q = from ei in session.Linq<EmployeeInsurance>()
        where insuranceNumberSearch == null 
                ? true 
                : ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim())
        select ei;
Run Code Online (Sandbox Code Playgroud)

无论insuranceNumberSearch是null还是非null,都会计算表达式的所有部分.

我正在使用LINQ到NHibernate

更新:

不幸的是,我把第一个片段错了.正确的是:

if (insuranceNumberSearch == null || (insuranceNumberSearch != null && ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim()))
doSomething();
Run Code Online (Sandbox Code Playgroud)

要么

bool b1 = insuranceNumberSearch == null ? true : ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim());
if (b1)
doSomething();
Run Code Online (Sandbox Code Playgroud)

在两种以上时insuranceNumberSearchnull,剩余表达式不评估任何更多.如果这样的行为不存在,insuranceNumberSearch.Trim()将导致引用对象为空异常.遗憾的是,LINQ(或者LINQ-to-NHibernate)不服从这样一个好的行为并且即使在出现错误时insuranceNumberSearch也会评估所有表达式null.

更新2:我发现了一个类似的问题:|| (或)Linq中使用C#的操作员

Ben*_*zun 5

打败我,但你不会用

if (
     (insuranceNumberSearch == null) ||
     ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim()))
  doSomething();
Run Code Online (Sandbox Code Playgroud)

在你的语句中,是否在LINQ表达式中?