0

我有以下代码:

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 的新手,但我知道有两种方法可以编写选择。有人可以告诉我如何以另一种方式重写它。还有什么区别吗?人们最常使用哪种方式?

4

3 回答 3

2

另一种方式如下所示:

_referenceRepository.GetPk(pk)
                    .Select(d => new Reference.Grid 
                                 { 
                                     PartitionKey = d.PartitionKey, 
                                     RowKey = d.RowKey, 
                                     Value = d.Value, 
                                     Order = d.Order 
                                 });

您使用的查询语法被编译器翻译成我使用的方法语法,因此它们都被编译为相同的 IL。
你应该选择一个你更舒服的。我更喜欢方法语法,因为我发现它更具可读性,但是 YMMV。

于 2012-08-31T08:02:23.967 回答
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 查询语法与方法语法 (C#)

您更喜欢哪种 LINQ 语法?Fluent 或查询表达式

于 2012-08-31T08:03:19.780 回答
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)

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

就个人而言,我发现我经常在两者之间切换。我会支持较大查询的查询语法,如果整个表达式包含的调用比例很高,但没有与那些查询语法等效的调用,我会支持方法语法,但有很多地方只是一个问题我当时输入的任何内容。

于 2012-08-31T09:14:47.617 回答