如何将使用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 ,它看起来像:
上述就是C#学习教程:如何将使用ROW_NUMBER()的查询转换为linq?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
class MyObject { public Int32 rowindex; public Int32 SNo; public String Name; publig Int32 Age; } /* build "connection" */ connection.Query("SELECT * FROM (SELECT ROW_NUMBER() ... ) ...");
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1027787.html