我正在使用 EF (4.4) 并且有一个包含N名为Value1...的列的平面表ValueN。
基于另一列 ( ValueIndex) 我需要获取N值为ValueN-1、ValueN和的三列ValueN+1
例如,如果ValueIndex我3需要获取Value2,Value3和Value4.
为简单起见,假设ValueIndex没有边界问题,即不是1或N我有 7Value列。
如果这是在内存中,我会做(并且可能会做)这样的事情:
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)之后的查询,而不是大量的开关/案例?