我尝试使用Entity Framework限制原始SQL查询返回的结果 问题是软件在软件级别而不是在数据库级别执行此操作。
ctx.Database.SqlQuery<ViewModelQuery>(sql)
.Skip(totalPage * (page - 1))
.Take(totalPage)
.ToList();
如何解决这个问题,发送到数据库的命令包括offset和fetch?
答案 0 :(得分:2)
这是解决它的唯一方法,更改sql
查询或将Linq提供给实体查询。因为Database.SqlQuery
已经开始将记录作为IEnumerable
返回。 (它已经由SQL Server提取)它的形式不是IQueryable
。因此,您有两种选择来执行它;
SELECT c1,c2 from where table
OFFSET 10 ROWS -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows
Linq to Entities
表单并执行IQueryable
- Skip
。答案 1 :(得分:1)
我假设ctx是从DbContext派生的类的对象。
显然,您选择不使用LINQ编写查询,但是您选择使用自己的SQL命令。您的变量sql是一个字符串,其中包含sql中的命令。
那么为什么不在这个字符串中添加offset和fetch:
Select ....
From ...
...
OFFSET @Skip ROWS FETCH NEXT @Take ROWS ONLY;
它可以工作,但我认为一旦你决定使用实体框架,你应该重新考虑使用sql语句的决定。您的DbSet类代表您的表,您的DbContext类知道您的表之间的关系。它旨在隐藏内部SQL用于与您的数据库通信。
DbContext的用户不必知道用于保存数据的方法。它可以通过使用SQl或MySql的数据库,它可以是Mongo,甚至是电子表格文件。这对于DbContext的用户是隐藏的,因此您无需更改用户即可更改数据库。
通过在界面中使用SQL,您违反了此信息隐藏。为什么不使用Linq查询ViewModelQuery项的页面?