【问题标题】:db.Database.SqlQuery<>().ToPagedList()db.Database.SqlQuery<>().ToPagedList()
【发布时间】:2015-07-13 05:59:29
【问题描述】:

当我使用时:

var result = db.votes.ToPagedList(pageNumber, pageSize);

result get [pageSize] rows from database with good performance 不发送到数据库“select * from table”

但是当我使用时:

var q2 = SELECT * FROM [dbname].[dbo].[v1] ";

var result = db.Database.SqlQuery&lt;ISMS&gt;(q2).ToPagedList(pageNumber, pageSize);

result 从内存中的数据库中捕获所有行,然后将其转换为 pagedlist 和 它非常慢,因为(向数据库发送查询是'select * from table')

我使用 sqlServer profiler 监控所有内容。

但是,出于多种原因,我想使用 db.Database.SqlQuery 并获得良好的性能,我该怎么办?

我的测试:

1.var result = db.Database.SqlQuery&lt;ISMS&gt;(q2).AsQueryable().ToPagedList(pageNumber, pageSize);

它还将“select * from table”发送到数据库

2.

var q = string.Format("SELECT *  FROM [dbname].[dbo].[{0}] " +
    "ORDER BY id " +
    "OFFSET  {1} ROWS " +
    "FETCH NEXT {2} ROWS ONLY ", tablename , 20 * (page - 1), 20);

但是当我在上面使用时,我不能在视图中使用@Html.PagedListPager

【问题讨论】:

    标签: sql-server asp.net-mvc entity-framework pagedlist


    【解决方案1】:

    PagedList 在您传递 IQueryable 时效果最佳,因为它会知道如何根据您的页面和页面大小生成需要发送到数据库的查询。

    使用 SqlQuery 意味着您自己对数据库执行,然后将结果(已经在内存中)传递给 PagedList。

    如果您对使用 SqlQuery 感兴趣,则需要自己处理分页。

    【讨论】:

      【解决方案2】:

      您应该只从数据库中选择所需的行。

      例如:

      `WITH Orderedtable AS ( 选择一些东西 ROW_NUMBER() OVER (ORDER BY something) AS 'RowNumber' 从表 )

      选择 * FROM有序表 WHERE RowNumber BETWEEN 1000 AND 2000`

      其中 1000 是起始记录数,2000 是结束记录数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-14
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 2016-11-04
        相关资源
        最近更新 更多