【问题标题】:Entity Framework Pagination Performance Considerations实体框架分页性能注意事项
【发布时间】:2014-04-08 18:46:47
【问题描述】:

我对 Entity Framework 6 中的复杂查询相当陌生,所以我有一个与分页相关的问题。

场景如下:我有一个项目,我以自己的形式描述了数据模型,并使用 T4 模板,它生成了适当的实体,高保真更改跟踪伴随实体,一个复杂的动态搜索查询实体,它是用于询问有关关联模型的问题(例如 entity.SearchNameCriterium = "t"; entity.SearchNameType = StringSearchType.StartsWith,围绕此构建的 UI 将为用户提供强大的搜索工具。)

为此,我有一部分是使用分页来下拉组成元素列表的: 当我使用“插入”按钮插入内容时,如果溢出到下一页(每次“x”个项目,在常量中定义——我稍后会将其移至设置)我使用以下代码:

this.context.SaveChanges();
int offset = searchCurItemLstCriteriaSkip - 1;
var queryBase = this.queryCurItemLstFormContainer;
int idFind = newDataContext.Identifier;
while (queryBase.Any())
{
    queryBase = queryCurItemLstFormContainer.Skip((++offset) * searchCriteriaCount).Take(searchCriteriaCount);
    if (queryBase.Any(k => k.Identifier == idFind))
    {
        this.searchCurItemLstCriteriaSkip = offset * searchCriteriaCount;
        break;
    }
}

基本原理是项目将始终在当前页面或当前页面之后的数据库中的某个点输入,因此理论上您可以从当前页面开始并继续前进。

我只是想知道是否有更好的方法来做到这一点,或者这种方法是否有效......?如果有人想知道:组合框用于选择当前项目,因为列表只会浪费空间,您一次只需要一个项目,并且搜索功能在 ComboBox 的下拉列表中同样有效。与此关联的 UI 元素是通过文本模板生成的 XAML。

我只是想确定我了解查询移动到最新页面可能对非常大的数据库产生的影响。

执行 query.Select(k=>k.Identifier).Count() / itemsPerPage 的性能考虑是什么?在这种情况下会更快吗?

洞察力非常受欢迎。

【问题讨论】:

    标签: c# wpf entity-framework pagination


    【解决方案1】:

    基于这个重点,在查询上使用Count(),将选择限制在标识符:使用Count功能快几个数量级。

    这背后的基本原理是:如果您正在分页并且使用迭代方法,如果有 10,000 条记录,每页有 25 个项目,则至少有 800 个查询(400 个用于检查是否有更多项目,400 个用于检查标识符范围)命中数据库,而计数只有一个。

    尽管 Count 可以被视为潜在的昂贵操作,但在最初所述的方法中对数据库的所有查询之间的延迟大于单个 Count 请求。有时最简单的解决方案是最好的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2017-01-24
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多