我如何知道使用 Entity Framework 的查询执行进度?

How can I know the progress of a query execution using Entity Framework?

 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 和 entity framework。

不幸的是,使用 Entity Framework 无法实现这一点。 SQL Server also doesn't allow you to do what you want。您可能应该在用户等待时简单地显示一个 activity 指示器。

您可以重组您的代码以首先请求总项目计数,然后使用 .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;

}

下面这个例子怎么样?它应该有效,至少在 "initial load" 的情况下 - 当您从数据库中填充 table 时。

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();
}