当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-11 11:16:57 C#

如何将使用ROW_NUMBER()的查询转换为linq?我的表由三列组成(sno、name、age)。我正在从具有额外列(行号)的数据库中检索此表并使用此代码:select*from(selectROW_NUMBER()over(orderbySNoasc)asrowindex,SNo,Name,AgefromtblExample)作为示例其中rowindex在((pageindex*10)+1)和((pageindex+1)*10)之间请注意,pageindex是一个接受用户传递的一些整数值的变量。我的数据库是SqlServer2008。我想使用Linq编写相同的查询。我该怎么做您可以将查询写为beowvarindex=1;varpageIndex=1;varpageSize=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查询返回的,而是由成员选择表达式添加的。最好的情况(如果你需要元数据):varrows=db.tblExample//数据库上下文.OrderBy(x=>x.SNo)//设置一个orderby.AsEnumerable()//强制执行查询(现在我们有本地数据集).Select(x=>new{rowindex=i,SNo=x.Sno,Name=x.Name,Age=x.Age});//现在您有了原始查询这里唯一的缺点是您必须拉取整个数据集才能获取这些元数据。但是,如果您使用.Skip和.Skip,LINQ会自动将其转换为行号(之后您将无法使用该元数据)。例如varpageIndex=/*???*/;varrows=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(SELECTROW_NUMBER()OVER(ORDERBY[t0].[tblExample],[t0].[SNo])AS[ROW_NUMBER],[t0].[SNo],[t0].[Name],[t0].Age]来自[tblExample]AS[t0])AS[t1]WHERE[t1].[ROW_NUMBER]BETWEEN@p0+1AND@p0+@p1ORDERBY[t1].[ROW_NUMBER]所以现在row_number在SQL中使用,但你不能在代码中访问它。如果你真的想要这种访问,最好手动将查询发送到服务器。这种东西的一个很好的库是dapper-dot-net,它看起来像:以上是C#学习教程:HowtoconvertaqueryusingROW_NUMBER()tolinq?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——classMyObject{publicInt32rowindex;公共Int32S号;公共字符串名称;发布Int32年龄;}/*建立“连接”*/connection.Query("SELECT*FROM(SELECTROW_NUMBER()...)...");本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢