【发布时间】:2016-07-10 06:46:33
【问题描述】:
我有以下代码来执行全文搜索。它创建一个查询,获取该查询返回的总行数,然后仅检索当前页面的实际行数。
// Create IQueryable
var query = from a in ArticleServerContext.Set<Article>()
where a.Approved
orderby a.UtcDate descending
select a;
// Get total rows (needed for pagination logic)
int totalRows = query.Count()
// Get rows for current page
query = query.Skip((CurrentPage - 1) * RowsPerPage).Take(RowsPerPage);
这很好用,但需要两次往返数据库。为了优化代码,有没有办法重新处理这个查询,使它只往返数据库一次?
【问题讨论】:
-
在我看来不是。当然,如果您不想将所有行都存储在内存中。
-
我不认为你可以在一次往返中做到这一点,我能想到的唯一方法是重新考虑你的分页工作而不必得到总数
-
完全同意@JanR。实现这一目标的唯一方法是在一个查询中使用分页。如果结果查询返回
null,则没有数据可显示。 -
您写道,分页逻辑需要
totalRows变量,但您似乎从未使用过它。 -
一般来说,除非网络有问题 - 我会说可能有其他地方可以优化成本/效益,而不是担心额外的数据库往返。尤其是您可以轻松地缓存这样的值以避免每次都调用它。
标签: c# sql linq iqueryable