处理LINQ查询中的NULL参数

时间:2010-11-23 14:53:59

标签: c# linq

假设您在LINQ查询where子句中有参数,您如何处理?

以下是一个例子:

var peoples= from i in individuals
  where (string.IsNullOrEmpty(lastName) i.LastName.Equals(lastName))
  select i;

5 个答案:

答案 0 :(得分:15)

尝试了解幕后发生的事情:

  • 编译器如何翻译查询表达式
  • LINQ to Objects如何流式传输数据,以及它如何延迟执行
  • 查询如何通过IQueryable和表达式树远程执行

同样值得熟悉两种查询表达式,例如

var query = from person in people
            where person.IsAdult
            select person.Name;

和“点符号”:

var query = people.Where(person => person.IsAdult)
                  .Select(person => person.Name);

了解两者都可以让您为任何特定查询选择最易读的形式。

答案 1 :(得分:10)

查询表达式的结果是查询对象,而不是查询的结果。如果需要结果,可以要求查询对象开始提供结果。也就是说,当你说:

var names = from c in customers where c.City == "London" select c.Name;

然后,名称是一个查询对象,代表“让我得到伦敦所有客户的名字”。它不是不是记忆中所有居住在伦敦的客户的名字;查询结果按需计算。直到你说:

foreach(var name in names) ...

计算实际结果。

这意味着如果两次询问同一个查询对象的结果,答案可能会有所不同。客户列表可能在您第一次询问和第二次询问之间发生了变化。因为查询推迟获得结果,所以您总能得到新的结果。但是你有时会做两次相同的工作。

答案 2 :(得分:5)

101 LinQ Samples您可以从MSDN的样本开始

答案 3 :(得分:2)

我可以为LINQ开头的人提供的最佳建议是LINQPad。它是一个非常宝贵的工具,可以显着加快您的学习过程。它附带了大量的示例,可以演示并让您使用所有LINQ运算符。

答案 4 :(得分:2)

你在LINQ中这样做,就像在"正常" C#。

在您的示例中,您使用了string.IsNullOrEmpty(),因此您不必区分null和""。如果是这样的话,你可以写一下......如下:

if ((lastName ?? "") == (i.LastName ?? ""))
{
   // equal
}

注意:The ?? operator returns the left-hand operand if it is not null, or else it returns the right operand.

您可以将该逻辑集成到LINQ查询中,如下所示:

var peoples = from i in individuals
              where (lastName ?? "") == (i.LastName ?? "")
              select i;