为了使其更通用:
from item in someSource select new{item.Something}
someSource.Select(item => new{item.Something}
from item in someSource where item.SomeProperty == someValue
someSource.Where(item => new{item.Something}
from item in someSource group item.Property1 by item.Property2
someSource.GroupBy(item => item.Property2, item => item.Property1)
from item in someSource orderby item.Property1
someSource.OrderBy(item => item.Property1)
from item in someSource orderby item.Property1 descending
someSource.OrderByDescending(item => item.Property1)
每个的一些第一种形式都不完整,因为它们需要以 aselect
或 a结尾group by
。这不适用于第二种形式,因此.OrderBy
即使您没有在orderby
. 转换时,请记住,.Select(x => x)
可以将其添加到每个查询中,并且通过等效性没有逻辑差异,最后一个orderby descending
添加select item
到末尾的示例使其成为一个完整的查询,相当于OrderByDescending
下面给出的查询。
几个加起来:
from item in someSource
where item.Property1 == 43
orderby item.Property2
select new {item.Property3, item.Property4}
someSource
.Where(item => item.Propert1 == 43)
.OrderBy(item => item.Propert2)
.Select(item => new{item.Propert3, item.Property4});
因为每个方法调用都是独立的,我们不需要在 lambda 中使用与第二种类型相同的术语,所以这相当于:
someSource
.Where(x=> x.Propert1 == 43)
.OrderBy(y=> y.Propert2)
.Select(z=> new{z.Propert3, z.Property4});
但是我们不能用第一种形式做到这一点,因为它是一个单独的子句,每个术语只定义一次。因为方法都是扩展,所以也等价于:
Queryable.Select(
Queryable.OrderBy(
Queryable.Where(someSource, x => x.Propert1 == 43),
y=> y.Propert2),
z=> new{z.Propert3, z.Property4});
或者
Enumerable.Select(
Enumerable.OrderBy(
Enumerable.Where(someSource, x => x.Propert1 == 43),
y=> y.Propert2),
z=> new{z.Propert3, z.Property4});
它适用于任何 .NET 语言,即使不支持该语言的 Linq 或扩展方法。
LinqPad 非常适合以多种方式检查查询(或任何 C# 代码),其中之一是将查询语法转换为等效的方法语法(无论如何,前者编译为后者)。
就个人而言,我发现我经常在两者之间切换。我会支持较大查询的查询语法,如果整个表达式包含的调用比例很高,但没有与那些查询语法等效的调用,我会支持方法语法,但有很多地方只是一个问题我当时输入的任何内容。