简单的 LINQ 查询 =>

本文关键字:查询 LINQ 简单 | 更新日期: 2023-09-27 18:33:59

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

   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")

简单的 LINQ 查询 =>

Where()括号内的部分需要是一个函数,该函数采用Customer并返回一个bool ean 值(这在 C# 的类型系统中Func<Customer, bool>)。

最常见的是使用 C# 的 Lambda 表达式编写该函数。

c =>部分的意思是"把传递给你的Customer称为c。然后用这个值 c 计算这个条件。如果没有=>左侧的c,编译器将无法知道c指的是什么。

如果他们写了这个:

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。对于小函数来说,这通常是矫枉过正的,并且随着小谓词函数远离其使用(因此是上下文)位置,进一步使其更难阅读。

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

考虑一下"他们为什么不..."你给出的例子。 在哪里申报c? 编译器如何知道它表示什么?

您可能想知道编译器如何知道 c 参数的类型,它显然知道,因为它允许您调用 CountryRegion 属性。 这是通过类型推断实现的。 Where方法需要一个带有参数的委托参数,其类型取决于序列的类型(在本例中为 Customers)。

由于Customers是一个IEnumerable<Customer>,编译器期望一个具有单个Customer参数的委托,因此它将lambda表达式的单个参数视为Customer变量。

> => 是 lambda 运算符请参阅此处: msdn

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