为什么评估布尔表达式的普通法不适用于LINQ? [英] Why ordinary laws in evaluating boolean expression does not fit into LINQ?
问题描述
在这样的代码中:
if (insuranceNumberSearch == null
? true
: ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim()))
doSomething();
其中insuranceNumberSearch
为空,在以下代码中,其余表达式不为空:
where insuranceNumberSearch
is null, remaining expression is not null while in following code:
var q = from ei in session.Linq<EmployeeInsurance>()
where insuranceNumberSearch == null
? true
: ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim())
select ei;
表达式的所有部分都将被求值,而不论insuranceNumberSearch为空还是不为空.
all section of expression is evaluated regardless of insuranceNumberSearch is null or is not null.
我正在使用LINQ进行NHibernate
I'm using LINQ to NHibernate
更新:
不幸的是,我把第一段代码写错了.正确的是:
Unfortunately I have put the first snippet wrong. The correct is:
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()
会导致引用对象为null 异常.遗憾的是,即使insuranceNumberSearch
为null
并导致错误,LINQ(或者可能是LINQ-to-NHibernate)也没有遵循这种良好的行为并评估所有表达式.
In both of above when insuranceNumberSearch
is null
, remaining expressions are not evaluated any more. If such a behavior does not exists, insuranceNumberSearch.Trim()
will cause a reference object is null exception. Sadly LINQ (or maybe LINQ-to-NHibernate) does not obey such a nice behavior and evaluate all of expression even when insuranceNumberSearch
is null
and results in error.
更新2:我发现了一个类似的问题: || (或)使用C#
UPDATE 2: I found a similar question: The || (or) Operator in Linq with C#
推荐答案
打败我,但您不愿意使用
Beat me, but wth wouldn't you use
if (
(insuranceNumberSearch == null) ||
ei.InsuranceNumber.Contains(insuranceNumberSearch.Trim()))
doSomething();
在您的语句中,是否在LINQ表达式中?
in your statement, be it in the LINQ expression or not?
这篇关于为什么评估布尔表达式的普通法不适用于LINQ?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!