我正在使用 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)之后的查询,而不是大量的开关/案例?