web-dev-qa-db-ja.com

EF / Linqを介してKeyValuePairに投影する

私は次のようなEF/LinqクエリからKeyValuePairsのリストをロードしようとしています:

return (from o in context.myTable 
select new KeyValuePair<int, string>(o.columnA, o.columnB)).ToList();

私の問題は、これがエラーになることです

「LINQ to Entitiesでは、パラメーターなしのコンストラクターとイニシャライザーのみがサポートされています。」

これを回避する簡単な方法はありますか? KeyValuePairを使用する代わりに、このためのカスタムクラスを作成できることは知っていますが、それは車輪を再発明するようなものです。

32

テーブルからcolumnSとcolumnのみを選択し、メモリ内でさらに処理を移動します。

return context.myTable
              .Select(o => new { o.columnA, o.columnB }) // only two fields
              .AsEnumerable() // to clients memory
              .Select(o => new KeyValuePair<int, string>(o.columnA, o.columnB))
              .ToList();

キーと値のペアを含む辞書を作成することも検討してください。

return context.myTable.ToDictionary(o => o.columnA, o => o.columnB).ToList();
68

LINQ to EntitiesはKeyValuePairをサポートしていないため、最初にAsEnumerableを使用してLINQ to Objectに切り替える必要があります。

return context.myTable
              .AsEnumerable()
              .Select(new KeyValuePair<int, string>(o.columnA, o.columnB))
              .ToList();
10
cuongle

また、1つのキーに複数の値を格納する場合、Lookupと呼ばれるものが存在します。

それぞれが1つ以上の値にマップされるキーのコレクションを表します。

ここには、公式の ドキュメント があります。

さらにlookupDictionary <TKey、List <TValue>>。よりもはるかに速いようです

0
Bartosz