简单的LINQ查询=>

时间:2012-05-14 00:32:00

标签: c# linq

这是使用northwind数据库的书中的一个例子。什么是=>意思 ?

   Northwind db = new Northwind(@"Data Source=.\SQLEXPRESS;InitialCatalog=Northwind");
   var orders = db.Customers
   .Where(c => c.Country == "USA" && c.Region == "WA")
   .SelectMany(c => c.Orders);
    Console.WriteLine(orders.GetType());

为什么他们不写

   Where(c.Country == "USA" && c.Regian == "WA")

4 个答案:

答案 0 :(得分:3)

Where()括号内的部分需要是函数,它取Customer并返回bool ean值(即{{1}在C#的类型系统中)。

使用C#的Lambda Expressions来编写该函数是最常见的。

Func<Customer, bool>部分表示“将传递给您的c =>称为Customer。然后使用c的值,计算此条件。 c左侧的c,编译器无法知道=>指的是什么。

答案 1 :(得分:1)

这是一个lambda表达式。它描述了功能;箭头左侧的变量是函数的参数。在这种情况下,函数有一个参数,因此箭头左侧有一个变量。

考虑一下你给出的“他们为什么不......”的例子。 c在哪里宣布?编译器如何知道它代表什么?

您可能想知道编译器如何知道c参数的类型,它显然会这样做,因为它允许您调用CountryRegion属性。这是通过类型推断完成的。 Where方法需要一个带有参数的委托参数,该参数的类型取决于序列的类型(在这种情况下为Customers)。

由于CustomersIEnumerable<Customer>,编译器需要一个具有单个Customer参数的委托,因此它将lambda表达式的单个参数视为Customer变量

答案 2 :(得分:1)

如果他们写了这个:

Where(c.Country == "USA" && c.Regian == "WA")

您在哪里定义变量c所指的内容?如果在我的代码中早些时候我写过的话会怎么样:

var c = "this is a string";

这个表示法定义了一个lambda结构,其中c =>绑定到Where函数所期望的委托输入 - 在这种情况下,c绑定到每一行,并且函数你运行c需要返回一个布尔值。

请注意,您可以编写如下函数:

public bool OnlyWA(Row c)
{
    return c.Country == "USA" && c.Regian == "WA";
}

然后像这样使用它:

var orders = db.Customers
               .Where(OnlyWA)
               .SelectMany(c => c.Orders);

此处您不再需要c,因为您使用的是命名函数而不是lambda变量。该函数的唯一参数代替c。这对于小函数来说通常是过度的,并且随着小谓词函数从其使用(以及因此上下文)位置移开而进一步使其更难阅读。

答案 3 :(得分:0)

=&GT;是lambda运算符 见这里:msdn

  

它在lambda表达式中用于将左侧的输入变量与右侧的lambda体分开。 Lambda表达式是类似于匿名方法的内联表达式,但更灵活;它们广泛用于以方法语法表示的LINQ查询中。