限制原始SQL查询的结果

时间:2017-12-14 18:28:57

标签: c# sql-server entity-framework

我尝试使用Entity Framework限制原始SQL查询返回的结果 问题是软件在软件级别而不是在数据库级别执行此操作。

ctx.Database.SqlQuery<ViewModelQuery>(sql)
            .Skip(totalPage * (page - 1))
            .Take(totalPage)
            .ToList();

如何解决这个问题,发送到数据库的命令包括offset和fetch?

2 个答案:

答案 0 :(得分:2)

这是解决它的唯一方法,更改sql查询或将Linq提供给实体查询。因为Database.SqlQuery已经开始将记录作为IEnumerable返回。 (它已经由SQL Server提取)它的形式不是IQueryable。因此,您有两种选择来执行它;

  1. 通过像这样获取和跳过表单来更改Sql查询;
  2. SELECT c1,c2 from where table
    OFFSET     10 ROWS       -- skip 10 rows
    FETCH NEXT 10 ROWS ONLY; -- take 10 rows
    
    1. 或者,您应该以{{1​​}}提供查询,以保持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项的页面?