简单的 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")
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
参数的类型,它显然知道,因为它允许您调用 Country
和 Region
属性。 这是通过类型推断实现的。 Where
方法需要一个带有参数的委托参数,其类型取决于序列的类型(在本例中为 Customers
)。
由于Customers
是一个IEnumerable<Customer>
,编译器期望一个具有单个Customer
参数的委托,因此它将lambda表达式的单个参数视为Customer
变量。
> => 是 lambda 运算符请参阅此处: msdn
它在 lambda 表达式中用于将左侧的输入变量与右侧的 lambda 主体分开。Lambda 表达式是类似于匿名方法的内联表达式,但更灵活;它们广泛用于以方法语法表示的 LINQ 查询中。