如何将使用ROW_NUMBER()的查询转换为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) 

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

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

您可以将查询写为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(); 

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

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

编辑

如果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 }) 

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

最佳情况(如果您需要元数据):

 var rows = db.tblExample // database context .OrderBy(x => x.SNo) // set an orderby .AsEnumerable() // force query execution (now we have local dataset) .Select(x => new { rowindex = i, SNo = x.Sno, Name = x.Name, Age = x.Age }); // now you have your original query 

这里唯一的缺点是必须拉动整个数据集才能获得这些元数据。 但是,如果您使用.Skip.Skip ,LINQ会自动将其转换为rownumber(您之后将无法使用该元数据)。 例如

 var pageIndex = /* ??? */; var rows = db.tblExample .OrderBy(x => x.SNo) .Skip(pageIndex * 10).Take(10); 

哪个应该给你这样的东西:

 SELECT [t1].[SNo] AS [SNo], [t1].[Name] AS [Name], [t1].[Age] AS [Age] FROM ( SELECT ROW_NUMBER() OVER (ORDER BY [t0].[tblExample], [t0].[SNo]) AS [ROW_NUMBER], [t0].[SNo], [t0].[Name], [t0].Age] FROM [tblExample] AS [t0] ) AS [t1] WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1 ORDER BY [t1].[ROW_NUMBER] 

所以现在row_number在SQL内部使用,但你无法在代码中访问它。

如果您真的想要这种访问,最好手动将查询发送到服务器。 一个适用于此类事情的lib是dapper-dot-net ,它看起来像:

 class MyObject { public Int32 rowindex; public Int32 SNo; public String Name; publig Int32 Age; } /* build "connection" */ connection.Query("SELECT * FROM (SELECT ROW_NUMBER() ... ) ...");