私は次のようなEF/LinqクエリからKeyValuePairsのリストをロードしようとしています:
return (from o in context.myTable
select new KeyValuePair<int, string>(o.columnA, o.columnB)).ToList();
私の問題は、これがエラーになることです
「LINQ to Entitiesでは、パラメーターなしのコンストラクターとイニシャライザーのみがサポートされています。」
これを回避する簡単な方法はありますか? KeyValuePairを使用する代わりに、このためのカスタムクラスを作成できることは知っていますが、それは車輪を再発明するようなものです。
テーブルから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();
LINQ to EntitiesはKeyValuePair
をサポートしていないため、最初にAsEnumerable
を使用してLINQ to Objectに切り替える必要があります。
return context.myTable
.AsEnumerable()
.Select(new KeyValuePair<int, string>(o.columnA, o.columnB))
.ToList();
また、1つのキーに複数の値を格納する場合、Lookupと呼ばれるものが存在します。
それぞれが1つ以上の値にマップされるキーのコレクションを表します。
ここには、公式の ドキュメント があります。
さらにlookupはDictionary <TKey、List <TValue>>。よりもはるかに速いようです