相关疑难解决方法(0)

是否对SQL WHERE子句进行了短路评估?

例如:

SELECT * 
FROM Table t 
WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key) 
Run Code Online (Sandbox Code Playgroud)

如果@key IS NULL的计算结果为true,那么@key IS是否为NULL并且@key = t.Key是否已计算?

如果不是,为什么不呢?

如果是,是否有保证?它是ANSI SQL的一部分还是特定于数据库?

如果是数据库特定的,SqlServer?甲骨文?MySQL的?

参考:短路评估

sql short-circuiting

135
推荐指数
6
解决办法
5万
查看次数

有关C#短路评估的最佳实践是什么?

另一个帖子中的评论中的答案和随后的辩论促使我问:

在C#||中 和&&是逻辑运算符的短路版本 和&分别.

用法示例:

if (String.IsNullOrEmpty(text1) | String.IsNullOrEmpty(text2) | String.IsNullOrEmpty(text3))
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

与:

if (String.IsNullOrEmpty(text1) || String.IsNullOrEmpty(text2) || String.IsNullOrEmpty(text3))
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

在编码实践方面哪个更好用,为什么?

注:我不知道这个问题是相似的这个问题,但我相信它值得特定语言的讨论.

c#

16
推荐指数
2
解决办法
9138
查看次数

为什么lambda中的这个短路不起作用?

为什么linq试图检查第二个表达式呢?

.Where(t =>  String.IsNullOrEmpty(someNullString) || t.SomeProperty >= Convert.ToDecimal(someNullstring))
Run Code Online (Sandbox Code Playgroud)

通常的解决方法是什么?

更新:
当然是关于LINQ to SQL.它无法转换为SQL.

c# linq linq-to-sql

12
推荐指数
1
解决办法
1811
查看次数

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

在这样的代码中:

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#的操作员

c# linq linq-to-nhibernate

4
推荐指数
1
解决办法
936
查看次数

List.Where("string".Contains()) 在 LINQ 查询中返回 NULL

我的Product班级:

public class Product {
 public int Id { get; set; }
 public string NameEnglish { get; set; }
 public string NameItalian { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的Language班级:

public class Language{
  public int Id { get; set; }
  public string LanguageType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个使用“名称”属性在产品中搜索并返回的方法List<Product>

List<Product> GetProductsFromSearch(int languageId, string searchedData){
    var products = _contex.Products.ToList();
    switch(languageId) //LanguageId 1 = English , LangaugeId 2 = Italian
    {
       case 1:
            return products.Where(i=>i.NameEnglish.Contains(searchedData)).ToList();
       case 2:
            return …
Run Code Online (Sandbox Code Playgroud)

.net c# linq entity-framework

0
推荐指数
1
解决办法
705
查看次数