私はEF(4.4)を使用しており、...N
という名前の列を持つフラットテーブルを持っています。Value1
ValueN
別の列 ( ) に基づいて、 、、およびの値をValueIndex
持つ 3 つの列を取得する必要があります。N
ValueN-1
ValueN
ValueN+1
たとえば、 、、およびを取得する必要があるValueIndex
場合。3
Value2
Value3
Value4
ValueIndex
簡単にするために、境界の問題がないと仮定します。つまり、 1
or N
and ではなく、7 つValue
の列があるとします。
これがメモリ内にある場合、私は次のようなことをします (おそらくそうするでしょう):
table.Select(t =>
new {
ValueIndex = t.ValueIndex,
Values = new[] {
Value1, Value2, Value3, Value4, Value5, Value6, Value7
}
})
.Select(t =>
new[] {
Values[ValueIndex-1], Values[ValueIndex], Values[ValueIndex+1]
}
);
残念ながら、配列インデックスがサポートされていないため、これは EF では機能しません。
回避策として、配列インデックスをインデクサー選択に置き換えてみました:
.Select(t =>
new[] {
t.Values.Where((v, i) => i == t.ValueIndex-1).First(),
t.Values.Where((v, i) => i == t.ValueIndex).First(),
t.Values.Where((v, i) => i == t.ValueIndex+1).First(),
}
);
残念ながら、それもサポートされていません (LINQ to Entities は変数のWhere
メソッドを認識しません)。t.Values
コードに巨大な switch ステートメントは特に必要ありません。
tables.Select(t =>
new[] {
t.ValueIndex == 2 ?
new[] {
t.Value1,
t.Value2,
t.Value3,
}
: t.ValueIndex == 3 ?
new[] {
t.Value2,
t.Value3,
t.Value4,
}
: // Etc..
}
);
それで、大規模なスイッチ/ケース以外の方法でEF(つまり、SQLに変換可能)を使用した後のクエリを実現する方法はありますか?