如何将使用ROW_NUMBER()的查询转换为linq?

Sri*_*nth 10 c# linq

我的表由三列组成(sno,name,age).我正在使用额外的列(行号)从数据库中检索此表,并使用以下代码:

select * from (
    select ROW_NUMBER() over (order by SNo asc)as rowindex,SNo,Name,Age 
    from tblExample) 
    as example where rowindex between ((pageindex*10)+1) and ((pageindex+1)*10)
Run Code Online (Sandbox Code Playgroud)

注意,pageindex是一个变量,它接受用户传递的一些整数值.

我的数据库是Sql Server 2008.我想使用Linq编写相同的查询.我怎么做?

D S*_*ley 7

不是直接翻译,但由于您的行号似乎仅用于分页,请尝试:

db.tblExample
  .OrderBy(t => t.SNo)
  .Select((t,i) => new {rowindex = i+1, t.SNo, t.Name, t.Age })
  .Skip(pageIndex * 10)
  .Take(10);
Run Code Online (Sandbox Code Playgroud)

编辑

如果Select((t,i) => ...)不起作用,您可以尝试通过在对查询进行保湿后添加索引号来合成索引号:

db.tblExample
  .OrderBy(t => t.SNo)
  .Skip(pageIndex * 10)
  .Take(10)
  .AsEnumerable();
  .Select((t,i) => new {rowindex = (pageIndex*10)+i+1, t.SNo, t.Name, t.Age })
Run Code Online (Sandbox Code Playgroud)

除了不从SQL查询返回字段的事实外,您应该使用等效rowindex的SQL,而是由成员选择表达式添加.


sre*_*ree 7

您可以将查询写为beow

var index=1;
var pageIndex=1;
var pageSize = 10;
data.Select(x => new
{
    RowIndex = index++,
    Sno = x.Sno,
    Name = x.Name,
    Age = x.Age
}).OrderBy(x => x.Name)
.Skip(pageSize * (pageIndex - 1)).Take(pageSize).ToList();
Run Code Online (Sandbox Code Playgroud)

  • `表达式树可能不包含赋值运算符.这究竟是如何为您工作的(没有首先在本地缓存列表)? (3认同)