【问题标题】:How can I know the progress of a query execution using Entity Framework?如何使用 Entity Framework 知道查询执行的进度?
【发布时间】:2015-01-19 16:26:50
【问题描述】:
 public ActionResult SearchBook(BookSearchModel model)
    {
        using(var db = new BooksEntities())
        {
            var bookName = db.bookTables.Where(m => m.bookName == model.bookName).ToList();
            if(bookName.Count >= 1)
            {
                foreach (var book in bookName)
                {
                    model.bookName = book.bookName;
                }
            }
            else
            {
                model.bookName = "Cannot Find Book";
            }               
        }
        return Json(model.bookName);
    }

我这里有这段代码,它从数据库中检索符合特定条件的项目。我想添加的是通过完成数据库搜索来检索进度,百分比明智。我的总体目标是创建一个进度条,它可以真实地模拟搜索完成还剩多长时间。

我正在使用 MVC 和实体框架。

【问题讨论】:

  • 和 ASP.NET MVC 一点关系都没有。

标签: sql-server ajax database entity-framework progress


【解决方案1】:

您可以重组您的代码以首先请求总项目数,然后使用 .Skip 和 .Take 创建您自己的循环以发送多个请求,每次接近计数时更新进度条,如下所示伪代码:

int count = db.bookTables.Count() / 100;
ProgressBar.maxValue = count;
for (int i = 0; i < count; i++)`
    db.bookTables.Where(...).Skip(100 * i).Take(100);
    ProgressBar.Value = i;

我建议不要这样做 - 它的性能不如仅进行查询,老实说,如果您的查询花费的时间足够长以至于您想要一个进度条,您可能需要考虑对其进行修改- 你能优化你的查询,让它运行得更快吗?您是否可以实现某种延迟加载模式,仅获取此时您真正想要呈现给用户的部分数据,然后在用户需要时加载其余部分?

另一种可能性是在现有的 foreach 循环中实现某种进度逻辑 - 将其转换为 for 循环并在那里更新进度条值,如下所示:

int i = 0;
foreach (var book in bookName)
{
  ProgressBar.Value = i++;
  model.bookName = book.bookName;

}

【讨论】:

  • 这是一个了不起的答案。真正解释了如何获得良好模拟的指南。
【解决方案2】:

Unfurtunetely,您无法使用实体框架实现这一目标。 SQL Server also doesn't allow you to do what you want。您可能应该在用户等待时简单地显示一个活动指示器。

【讨论】:

  • 谢谢。 :) 我设法做只是模拟它搜索的东西。
【解决方案3】:

下面的例子怎么样?它应该可以工作,至少在“初始加载”的情况下 - 当您从数据库填充表时。

using (var entities = new MyEntities())
{
    entities.MyTable.Local.CollectionChanged += (sender, args) =>
    {
        Log($"{args.Action.ToString()}, NEW: {args.NewItems?.Count},
            OLD: {args.OldItems?.Count}");
    };

    var result = entities.MyTable.Where(d => d.TimeStamp>dateTime).ToList();
}

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2018-02-01
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多