【问题标题】:Count before order, skip and take点单前数数,跳过取走
【发布时间】:2014-10-23 16:51:28
【问题描述】:

我将实体框架与工作单元和存储库模式一起使用。

对于具有排序、分页等功能的函数,我使用以下代码:

stammdatenEntityModels =
    _unitOfWork.StammdatenRepository.Get()
                .Where(
                    s =>
                    s.Geloescht == false &&
                    ((s.Auftraggeber != null && s.Auftraggeber.Bezeichnung.ToLower().Contains(keyword)) ||
                    (s.SerienNummer.Contains(keyword)) ||
                    (s.Bezeichnung.ToLower().Contains(keyword)) ||
                    (s.StammdatenKunde != null && s.StammdatenKunde.Name.ToLower().Contains(keyword)) ||
                    (s.BeginnVos.HasValue && s.BeginnVos == dateTime) ||
                    (s.VosDauer != null && s.VosDauer.Bezeichnung.ToLower().Contains(keyword)) ||
                    (s.Geraetewert.HasValue && s.Geraetewert.Value.ToString().Contains(keyword))
                    ))
                .OrderBy(orderBy)
                .Skip(inputModel.EntriesToDisplay*(inputModel.Page - 1))
                .Take(inputModel.EntriesToDisplay)
                .ToList();

现在我需要知道记录的数量,但在执行跳过和获取(用于分页)之前。

因此我再次使用相同的代码:

totalCount = _unitOfWork.StammdatenRepository.Get()
            .Count(
                s =>
                s.Geloescht == false &&
                ((s.Auftraggeber != null && s.Auftraggeber.Bezeichnung.ToLower().Contains(keyword)) ||
                (s.SerienNummer.Contains(keyword)) ||
                (s.Bezeichnung.ToLower().Contains(keyword)) ||
                (s.StammdatenKunde != null && s.StammdatenKunde.Name.ToLower().Contains(keyword)) ||
                (s.BeginnVos.HasValue && s.BeginnVos == dateTime) ||
                (s.VosDauer != null && s.VosDauer.Bezeichnung.ToLower().Contains(keyword)) ||
                (s.Geraetewert.HasValue && s.Geraetewert.Value.ToString().Contains(keyword))
                ));

不幸的是,这会导致大量冗余,并且我的查询被执行了两次。有没有更好的解决方案?

【问题讨论】:

    标签: entity-framework entity-framework-6


    【解决方案1】:

    我同意冗余。您可以做的是将特定参数(关键字、日期时间)的计数结果缓存一定时间,并在后续调用中再次使用它以从 StammDatenRepository 传递分页(跳过、获取)结果。

    这样你只需要对特定参数进行一次整体计数调用。

    找到this SO question 一个受人尊敬的会员国:

    从 SQL 的角度考虑,我想不出办法 一个普通查询来检索总计数和一个子集 数据,所以我认为你也不能在 LINQ 中做到这一点。

    所以,我真的认为您必须缓存一些计数结果以提高性能。您最了解如何针对您的具体情况进行操作,以及是否值得这样做......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      相关资源
      最近更新 更多