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を初めて使用しますが、selectを作成するには2つの方法があることを理解しています。誰かがこれを別の方法で書き直す方法を教えてくれませんか。また、違いはありますか? また、人々が最もよく使用する方法はどれですか?

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

あなたが言及した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>

また、違いはありますか? また、人々が最もよく使用する方法はどれですか?

最も読みやすく機能するものを使用してください。query-syntax でサポートされていないメソッドがいくつかあります。

MSDN: LINQ クエリ構文とメソッド構文 (C#)

どの LINQ 構文が好きですか? 流暢またはクエリ式

于 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)

selectそれぞれの最初の形式の一部は、またはで終わる必要があるため、完全ではありませんgroup by。これは 2 番目の形式には当てはまらないため、 の.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});

各メソッド呼び出しは個別であるため、2 番目の型のラムダで同じ用語を使用する必要はありません。したがって、これは次と同等です。

someSource
  .Where(x=> x.Propert1 == 43)
  .OrderBy(y=> y.Propert2)
  .Select(z=> new{z.Propert3, z.Property4});

しかし、最初の形式ではそれができません。これは、各用語が 1 回だけ定義された単一の句であるためです。メソッドはすべて拡張であるため、次と同等です。

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

Linq またはその言語の拡張メソッドのサポートがなくても、どの .NET 言語でも動作します。

LinqPad は、さまざまな方法でクエリ (または任意の C# コード) を調べるのに最適です。そのうちの 1 つは、クエリ構文を同等のメソッド構文に変換することです (とにかく、前者は後者にコンパイルされます)。

個人的には、私はこの 2 つを頻繁に切り替えています。大規模なクエリにはクエリ構文を優先します。式全体に、同等のクエリ構文を持たない呼び出しの比率が高い場合は、メソッド構文を優先しますが、それが問題になる場合はたくさんあります。その時に入力したものは何でも。

于 2012-08-31T09:14:47.617 に答える