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

时间:2015-01-19 16:26:51

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

 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和实体框架。

3 个答案:

答案 0 :(得分: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;

}

答案 1 :(得分:0)

毫无疑问,使用Entity Framework无法实现这一目标。 SQL Server also doesn't allow you to do what you want。您可能只需在用户等待时显示活动指示器。

答案 2 :(得分:0)

以下示例怎么样?它应该起作用,至少在“初始加载”的情况下 - 从数据库填充表时。

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