LINQ相当于Where子句中的SQL IsNull(..,..)

时间:2016-09-08 04:34:59

标签: c# linq

在下面的OUTER JOIN LINQ查询中,如果右侧行为null,则在Where子句中获取null异常(如果c.CustomerID与外部联接中的ord.CustomerID不匹配)。 问题:如果以下Where clause 注意中的ord.price为空,我该如何处理此案例:price是int?类型的可为空的列。

Query1 = from c in Customers
             join ord in Orders on c.CustomerId equals ord.CustomerId into cord
               from t in cord.DefaultIfEmpty()
             where t.price = null || t.price > 100
             select new {CustName = c.Name, OrderID = (t == null ? 0 : t.OrderId)};

更新

对不起,where子句中有拼写错误。

  1. 正如@ JeffMercado指出的那样,它应该是t.price不是 ord.price
  2. Where条款中缺少一个条款。我已将其更正为:where t.price = null || t.price > 100。但现在我收到了错误:operator || cannot be applied to operands of type '<null>' and 'int'

2 个答案:

答案 0 :(得分:4)

你可以这样做:

Query1 = from c in Customers
             join ord in Orders on c.CustomerId equals ord.CustomerId into cord
               from t in cord.DefaultIfEmpty()
             where (ord.price ?? 0) > 100
             select new {CustName = c.Name, OrderID = (t == null ? 0 : t.OrderId)};

答案 1 :(得分:0)

那里有语法问题:

where t.price = null || t.price > 100

应该是:

where t.price == null || t.price > 100

请注意: ==

正在发生的事情是您指定的t.price = null结果为null。 所以它有效地解析null || t.price > 100这就是编译器给你的原因:

  

运营商||不能应用于'&lt; null&gt;'类型的操作数和'int'