为什么评估布尔表达式的普通法不适用于LINQ? [英] Why ordinary laws in evaluating boolean expression does not fit into LINQ?

查看:64
本文介绍了为什么评估布尔表达式的普通法不适用于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();

在上述两种情况下,当insuranceNumberSearchnull时,不再对其余表达式求值.如果不存在这样的行为,则insuranceNumberSearch.Trim()会导致引用对象为null 异常.遗憾的是,即使insuranceNumberSearchnull并导致错误,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屋!

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