如何重新格式化以使用其他类型的LINQ查询格式?

时间:2012-08-31 08:01:14

标签: c# linq

我有以下代码:

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的新手,但我知道有两种方法可以编写一个选择。有人可以通过告诉我如何以其他方式重写这个来帮助。还有什么不同,人们最常使用哪种方式?

3 个答案:

答案 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>

  

人们最常使用的是哪种方式也存在差异?

使用最具可读性和效果的内容。查询语法中不支持某些方法。

MSDN: LINQ Query Syntax versus Method Syntax (C#)

Which LINQ syntax do you prefer? Fluent or Query Expression

答案 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)

每种形式的一些形式都不完整,因为它们需要以selectgroup 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#代码),其中之一就是将查询语法转换为等效的方法语法(无论如何,前者被编译为后者)。

就个人而言,我发现我在两者之间切换了很多。我会支持更大查询的查询语法,如果整个表达式包含的调用比例高,那么我会支持方法语法,这些调用没有与那些查询语法相同的查询语法,但是有很多内容只是一个问题无论我当时输入什么。