0

私は次のコードを見ています

    public IEnumerable<RoleRecord> GetRoles() {
        var roles = _roleRepository.Table.Select(role => role);
        return roles.ToList();
    }

Tableです_IQueryable<RoleRecord> Table { get; }

これを書く良い方法はありますか?

4

6 に答える 6

7

Select(role => role)効果的にそれ自体に投影されるため、基本的にここでは何もしません。

return  _roleRepository.Table.ToList();

...同じことを達成するか、または:

return _roleRepository.Table;

解決されたリストではなく、列挙可能なものを返すことに満足している場合。

これは、 がまたはの対象となるTable有効な推測を行っています。IEnumerable<T>Select()ToList()

は列挙型ToListを完全に反復しますが、 として返されます。の消費者は、リストを反復することになります。これは、 .TableIEnumerable<T>Table

更新:IEnumerable<T> @servy とチャットした後、 (あなたの場合は from Select(role => role)) を返すList<T>ことと a を返すことの重要な違いの 1 つは、 a を使用するList<T>と、呼び出し元がIEnumerable<T>a に戻ってキャストし、それを変更できるList<T>ことです。

IEnumerable<RoleRecord> results = GetRoles();
var asList = (List<RoleRecord>)results;
asList.Add(new RoleRecord());
asList.RemoveAt(0);

ただし、自己投影はここでの決定要因ではないことに注意してください。それは、IEnumerable<T>実装としてイテレータ ブロックを使用していて、List<T>.

とは言っても、この特定の動作の違いは、あなたのケースToList()では .

于 2012-09-11T15:55:44.887 に答える
2

フィルター基準がない場合は、Select を呼び出す必要はありません。

何かのようなもの:

 public IEnumerable<RoleRecord> GetRoles() {
        return _roleRepository.Table.ToList();
    }

より簡単でしょうか?.ToList() を呼び出すと明らかにコレクションがハイドレートされますが、これはあなたが望んでいたことだと思います。

于 2012-09-11T15:56:27.370 に答える
1

それは次のように単純化する必要があります。

  public IEnumerable<RoleRecord> GetRoles() {
        return _roleRepository.Table.ToList();
    }

基本的にa => aは、単なる「アイデンティティ」射影、つまりaそれ自体への射影です。この場合、実際には何も購入しません。

アクションを実行したくない場合に、プレースホルダーとして役立つ場合があります。ただし、この場合、最終結果は元のシーケンスに対して を実行するだけなので、必要はありません。これは .ToList()なしで直接実行できますSelect()

もちろん、これは元のメソッドの 2 つの行の間で他に何も行われていないことを前提としています。

于 2012-09-11T15:56:12.377 に答える
1

LINQ は何をしSelect(a => a)ますか?

シーケンスの各要素を、指定した要素 (「a」) のみを含む新しい形式に射影します。

于 2012-09-11T15:56:56.917 に答える
1

Select メソッドは「射影」を返します。これは、列挙可能なソースの個々の要素をそれぞれ変更したものです。この場合、要素をそれ自体に射影するため、冗長です。

意図を推測する必要がある場合は、select が含まれており、クエリが "ToList()" ターミネータ (すべての要素を生成するように Linq チェーンの評価を強制する) でインライン化されていなかったと言えます。より簡単にデバッグして、クエリによって生成された要素を正確に確認できます。または、このクエリは、すべての LINQ クエリに SQL SELECT クエリの一部が必要であると考えている SQL に精通した人物によって最初に作成された可能性があります。

とにかく、Select を削除するだけでなく、このクエリは戻り値でインライン化することもできます。

public IEnumerable<RoleRecord> GetRoles() {
    return _roleRepository.Table.ToList();
}
于 2012-09-11T16:11:38.810 に答える
1

私はあなたがただ書くことができると信じています:

public IEnumerable<RoleRecord> GetRoles() {
    return _roleRepository.Table.ToList();
}

そうでない場合は、試すことができます

return (from r in _roleRepository.Table select r).ToList();
于 2012-09-11T15:58:55.643 に答える