私は次のコードを見ています
public IEnumerable<RoleRecord> GetRoles() {
var roles = _roleRepository.Table.Select(role => role);
return roles.ToList();
}
Table
です_IQueryable<RoleRecord> Table { get; }
これを書く良い方法はありますか?
はSelect(role => role)
効果的にそれ自体に投影されるため、基本的にここでは何もしません。
return _roleRepository.Table.ToList();
...同じことを達成するか、または:
return _roleRepository.Table;
解決されたリストではなく、列挙可能なものを返すことに満足している場合。
これは、 がまたはの対象となるTable
有効な推測を行っています。IEnumerable<T>
Select()
ToList()
は列挙型ToList
を完全に反復しますが、 として返されます。の消費者は、リストを反復することになります。これは、 .Table
IEnumerable<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()
では .
フィルター基準がない場合は、Select を呼び出す必要はありません。
何かのようなもの:
public IEnumerable<RoleRecord> GetRoles() {
return _roleRepository.Table.ToList();
}
より簡単でしょうか?.ToList() を呼び出すと明らかにコレクションがハイドレートされますが、これはあなたが望んでいたことだと思います。
それは次のように単純化する必要があります。
public IEnumerable<RoleRecord> GetRoles() {
return _roleRepository.Table.ToList();
}
基本的にa => a
は、単なる「アイデンティティ」射影、つまりa
それ自体への射影です。この場合、実際には何も購入しません。
アクションを実行したくない場合に、プレースホルダーとして役立つ場合があります。ただし、この場合、最終結果は元のシーケンスに対して を実行するだけなので、必要はありません。これは .ToList()
なしで直接実行できますSelect()
。
もちろん、これは元のメソッドの 2 つの行の間で他に何も行われていないことを前提としています。
LINQ は何をしSelect(a => a)
ますか?
シーケンスの各要素を、指定した要素 (「a」) のみを含む新しい形式に射影します。
Select メソッドは「射影」を返します。これは、列挙可能なソースの個々の要素をそれぞれ変更したものです。この場合、要素をそれ自体に射影するため、冗長です。
意図を推測する必要がある場合は、select が含まれており、クエリが "ToList()" ターミネータ (すべての要素を生成するように Linq チェーンの評価を強制する) でインライン化されていなかったと言えます。より簡単にデバッグして、クエリによって生成された要素を正確に確認できます。または、このクエリは、すべての LINQ クエリに SQL SELECT クエリの一部が必要であると考えている SQL に精通した人物によって最初に作成された可能性があります。
とにかく、Select を削除するだけでなく、このクエリは戻り値でインライン化することもできます。
public IEnumerable<RoleRecord> GetRoles() {
return _roleRepository.Table.ToList();
}
私はあなたがただ書くことができると信じています:
public IEnumerable<RoleRecord> GetRoles() {
return _roleRepository.Table.ToList();
}
そうでない場合は、試すことができます
return (from r in _roleRepository.Table select r).ToList();