为什么evaluting布尔表达式不适合普通的LINQ法律? [英] Why ordinary laws in evaluting boolean expression does not fit into LINQ?

查看:188
本文介绍了为什么evaluting布尔表达式不适合普通的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的被评估为null或is not null。

all section of expression is evaluated regardless of insuranceNumberSearch is null or is not null.

我使用LINQ to 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 ,剩下的表达式不计算了。如果这样的行为不存在, insuranceNumberSearch.Trim() 将导致的参考对象为空的异常。不幸的是LINQ(或者LINQ到NHibernate的)不服从这样一个很好的行为,即使在评估所有的表达 insuranceNumberSearch 和错误的结果。

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:我发现了一个类似的问题:的http://计算器.COM /问题/ 772261 /在有或运营商在LINQ-与-C

UPDATE 2: I found a similar question: http://stackoverflow.com/questions/772261/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?

这篇关于为什么evaluting布尔表达式不适合普通的LINQ法律?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆