我能用Lambda(方法语法)而不是(查询语法)执行哪些查询?
问题很简单,这是两者的一个例子:
int[] numbers = { 5, 10, 8, 3, 6, 12};
//Query syntax:
IEnumerable<int> numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;
//Method syntax:
IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);
我可以执行方法语法而不是查询语法的查询是什么?
答案 0 :(得分:5)
(这是一个比我最初写的更短的答案,但其他答案已经提供了一些细节。)
有两种原因可能希望使用lambda表达式而不是查询表达式:
查询表达式未涵盖的操作,是否完全没有涵盖的方法(例如Count
)或 中包含的操作的重载查询表达式,但不是那种形式。例如:
var indexedValues = values.Select((value, index) => new { value, index });
没有使用该重载的查询表达式表单。
当lambda形式更简单时。例如,如果您只有一个投影或过滤器,那么在一次调用中完成它比设置查询表达式的绒毛更简单:
var adults = people.Where(person => person.Age > 18);
Vs的:
var adults = from person in people
where person.Age > 18
select person;
此外,如果要在查询后继续表达式,则lambda表达式方法稍微整洁一些。例如,创建成人姓名列表:
var names = people.Where(person => person.Age > 18)
.Select(person => person.Name)
.ToList();
Vs的:
var names = (from person in people
where person.Age > 18
select person.Name).ToList();
括号最终有点刺激。
查询表达式闪现在引入透明标识符的操作中 - 加入,SelectMany
,let
等等。显然可以翻译这样的代码变成了lambda形式,它最终会变得非常难看。
答案 1 :(得分:4)
您可以在此处找到查询表达式语法中具有相应关键字的完整方法列表:Query Expression Syntax for Standard Query Operators。 List包含有关C#和VB.NET支持的信息。任何未列在其中的方法在C#和VB.NET中都不可用。
有趣的是,在VB.NET中有更多可用,然后在C#中。
答案 2 :(得分:2)
您无法在查询语法中执行select top 10
。您可以在方法语法中使用.Take(10)
。
也不支持聚合函数。
答案 3 :(得分:0)
LINQ查询语法直接转换为扩展方法语法。但是,相反的是不为真。 LINQ查询语法关键字支持的扩展方法多于其他方法。
因此,使用方法语法,您可以使用与LINQ查询语法完全相同或更多的 。通常LINQ查询语法更好阅读。
// LINQ query syntax
var query =
from num in numbers
where num % 2 == 0
orderby num
select num;
// Corresponding method syntax
var query = numbers
.Where(num => num % 2 == 0)
.OrderBy(num => num)
.Select(num => num);
使用方法语法而不是查询语法可以执行的操作的简单示例(因为没有关键字):
var query = numbers
.First();
如果您愿意,可以将两者结合使用:
var query =
(from num in numbers
where num % 2 == 0
orderby num
select num)
.First();
除了First
之外,还有大量的LINQ扩展方法(Sum
,Average
,Max
...)在LINQ查询语法中没有关键字。< / p>
顺便说一下,因为LINQ查询语法映射到扩展方法,所以不限制使用LINQ扩展方法。如果您在自己的自定义对象上定义了一个都接受委托的Select
和Where
方法,那么您可以在自己的对象上使用LINQ查询语法 !多么酷啊?例如,一个荒谬的例子:
public class MyClass
{
public MyClass Where(Func<string, bool> function)
{
return this;
}
public List<string> Select(Func<string, string> function)
{
return new List<string>();
}
}
MyClass myClass = new MyClass();
var x = from m in myClass
where !String.IsNullOrEmpty(m)
select m;