我只想在查询的返回结果中包含行号。
我发现以下帖子描述了我想要实现的目标,但却给了我一个例外
http://vaultofthoughts.net/LINQRowNumberColumn.aspx
“表达式树可能不包含赋值运算符”
在MS SQL中,我只使用ROWNUMBER()函数,我只是在LINQ中寻找等效函数。
答案 0 :(得分:2)
使用AsEnumerable()
评估客户端查询的最后部分,并在最后一部分添加一个计数器列:
int rowNo = 0;
var results = (from data in db.Data
// Add any processing to be performed server side
select data)
.AsEnumerable()
.Select(d => new { Data = d, Count = ++rowNo });
答案 1 :(得分:2)
我不确定LINQ to SQL是否支持它(但它确实会支持),但overload方法有Queryable.Select接受带有索引器的lambda。您可以按如下方式编写查询:
db.Authors.Select((author, index) => new
{
Lp = index, Name = author.Name
});
<强>更新强>
我运行了一些测试,但不幸的是LINQ to SQL不支持这种重载(3.5sp1和4.0)。它会抛出NotSupportedException
消息:
用于查询的不支持的重载 运营商'选择'。
答案 2 :(得分:0)
LINQ to SQL允许您映射SQL函数。虽然我没有对此进行测试,但我认为这种结构可行:
public partial class YourDataContext : DatContext
{
[Function(Name = "ROWNUMBER")]
public int RowNumber()
{
throw InvalidOperationException("Not called directly.");
}
}
并编写如下查询:
from author in db.Authors
select new { Lp = db.RowNumber(), Name = author.Name };