我有以下代码:
public IList<Reference.Grid> GetGrid(string pk)
{
return (
from d in _referenceRepository.GetPk(pk)
select new Reference.Grid
{
PartitionKey = d.PartitionKey,
RowKey = d.RowKey,
Value = d.Value,
Order = d.Order
})
}
我是LINQ的新手,但我知道有两种方法可以编写一个选择。有人可以通过告诉我如何以其他方式重写这个来帮助。还有什么不同,人们最常使用哪种方式?
答案 0 :(得分:2)
另一种方式看起来像这样:
_referenceRepository.GetPk(pk)
.Select(d => new Reference.Grid
{
PartitionKey = d.PartitionKey,
RowKey = d.RowKey,
Value = d.Value,
Order = d.Order
});
您使用的查询语法由编译器转换为我使用的方法语法,因此它们都被编译为相同的IL。
你应该选择一个你更舒服的人。我更喜欢方法语法,因为我发现它更具可读性,但YMMV。
答案 1 :(得分:2)
您提到的两种方法是方法和查询语法。您使用了查询语法。
方法语法相同:
public IList<Reference.Grid> GetGrid(string pk)
{
return (
_referenceRepository.GetPk(pk)
.Select(d => new Reference.Grid
{
PartitionKey = d.PartitionKey,
RowKey = d.RowKey,
Value = d.Value,
Order = d.Order
})).ToList();
}
请注意,我已将其更改为使用ToList
创建List<Reference.Grid>
。否则它将是IEnumerable<Reference.Grid>
。
人们最常使用的是哪种方式也存在差异?
使用最具可读性和效果的内容。查询语法中不支持某些方法。
答案 2 :(得分:1)
使它更通用:
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)
每种形式的一些形式都不完整,因为它们需要以select
或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});
OR
Enumerable.Select(
Enumerable.OrderBy(
Enumerable.Where(someSource, x => x.Propert1 == 43),
y=> y.Propert2),
z=> new{z.Propert3, z.Property4});
即使不支持Linq或该语言的扩展方法,它也适用于任何.NET语言。
LinqPad非常适合以各种方式检查查询(或任何C#代码),其中之一就是将查询语法转换为等效的方法语法(无论如何,前者被编译为后者)。
就个人而言,我发现我在两者之间切换了很多。我会支持更大查询的查询语法,如果整个表达式包含的调用比例高,那么我会支持方法语法,这些调用没有与那些查询语法相同的查询语法,但是有很多内容只是一个问题无论我当时输入什么。