3

我可以使用 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);

什么是我可以执行方法语法而不是查询语法的查询?

4

4 回答 4

5

(这个答案比我最初写的要短,但其他答案已经提供了一些细节。)

有两个原因可能希望使用 lambda 表达式而不是查询表达式:

  • 查询表达式根本没有涵盖的操作,无论是根本没有涵盖的方法(例如)还是查询表达式包含但不以该形式包含Count的操作的重载。例如:

    var indexedValues = values.Select((value, index) => new { value, index });
    

    没有使用该重载的查询表达式形式。

  • 当 lambda 形式更简单时。例如,如果您只有一个投影或过滤器,则在一次调用中完成它可能比设置查询表达式的绒毛更简单:

     var adults = people.Where(person => person.Age > 18);
    

    对比:

     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();
    

    对比:

     var names = (from person in people
                  where person.Age > 18
                  select person.Name).ToList();
    

    括号最终有点烦人。

查询表达式的亮点在于引入透明标识符的操作- 连接SelectManylet。虽然您显然可以将此类代码转换为 lambda 形式,但它最终会变得非常丑陋。

于 2013-03-22T06:51:47.230 回答
4

您可以在此处找到在查询表达式语法中具有相应关键字的方法的完整列表:标准查询运算符的查询表达式语法。列表包含有关 C# 和 VB.NET 支持的信息。任何未列出的方法在 C# 和 VB.NET 中均不可用。

有趣的是,在 VB.NET 中比在 C# 中可用的更多。

于 2013-03-21T21:50:07.510 回答
2

您不能执行select top 10查询语法。您可以.Take(10)在方法语法中使用。

也不支持聚合函数。

于 2013-03-21T21:44:14.333 回答
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 查询语法中没有关键字。


顺便说一句,由于 LINQ 查询语法映射到扩展方法,因此您不限于使用 LINQ 扩展方法。如果您在自己的自定义对象上定义都接受委托的 aSelectWhere方法,那么您可以在自己的对象上使用 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;
于 2013-03-21T21:44:30.763 回答