“由于DbContext已被处置,因此操作无法完成。”

时间:2020-01-30 05:31:39

标签: c# .net asp.net-mvc

public ActionResult Index(FormModel form)
{
    using (DBModels db = new DBModels())

    {
        var clients = from c in db.Clients
                      select c;

        if (!String.IsNullOrEmpty(form.SearchString))
        {
            clients = clients.Where(s => s.Full_Name.Contains(form.SearchString) || s.Class.Contains(form.SearchString)
            || s.Membership_Type.Contains(form.SearchString) || s.Membership_Type.Contains(form.SearchString) ||
            s.Notes.Contains(form.SearchString) || s.ClientID.Equals(form.SearchString));
        }
             if (form.IsChecked != null)
              {
                  clients = clients.Where(t => t.Paid == form.IsChecked);
              }
        return View(clients);

    }
}  

不明白为什么会发生此错误。我添加了一个搜索框来搜索数据库。我还添加了一个复选框,以显示未付费的客户。当我更改

return View(clients); 

返回

return View(db.Client.ToList()); 

它有效,但是我要避免,因为它显示了所有列表,而不是“ clients”变量,该变量显示了SearchString中的变量。

2 个答案:

答案 0 :(得分:2)

id是一个IQueryable。在请求第一次迭代之前,IQueryable不会枚举其值。到那时,您的DbContext已经被处置,因此枚举引发异常。

要解决此问题,请使用类似的

categories

从理论上讲,在调用ToList()之前,应避免数据库调用,但是自从我走那条路已经过去了一段时间。相反,我建议使用LinqKit中的PredicateBuilder构建一个完全针对数据库运行的查询,如下所示:

clients

答案 1 :(得分:0)

IQueryable类型的数据结构主要用于迭代目的,在使用ToList之前,它们不会产生值。 这就是为什么在处理dbcontext后不评估您的对象的原因。