我想知道如何构建一个查询表达式,该表达式理解所选择的给定项目是否是第一个。假设我从DB中选择了10个项目:
var query = db.Table.Take(10).Select(t => IsFirst ? t.Value1 : t.Value2);
有一个Select的索引变体,但在LINQ-to-SQL中不支持。如果得到支持,我的问题就会得到解决。还有其他伎俩吗?
例如,我可以在T-SQL上使用ROW_NUMBER()
,LINQ-to-SQL使用但不允许访问。
我知道我可以Concat
两个查询并使用第一个表达式,依此类推,但我不想操纵查询的其余部分,只是select语句本身,因为查询是在多个地方,这是我想在第一行表现不同的地方。如果不可能,我会考虑其他选择。
答案 0 :(得分:2)
您可以使用索引重载,但需要使用LINQ to Objects版本:
var query =
db.Table.Take(10).AsEnumreable()
.Select((t, index) => index == 0 ? t.Value1 : t.Value2);
答案 1 :(得分:1)
如果Table
有主键。你可以这样做:
var result= (
from t in db.Table.Take(10)
let first=db.Table.Take(10).Select (ta =>ta.PrimayKey).First()
select new
{
Value=(t.PrimaryKey=first?t.Value1 : t.Value2)
}
);