1

最後に検索したクエリをグローバル変数に保存したいのですが、それを別のメソッドで使用すると、次のように表示されます。

ObjectDisposedException はユーザー コードによって処理されませんでした: ObjectContext インスタンスは破棄されており、接続を必要とする操作には使用できなくなりました。

IQueryable lastQry = null;

private void SearchMethod()
{
   using(var ctx = new entityContex())
   {
      var qry = ctx.Table1.Where(t=> t.Name.StartWith(txtName.Text)).Take(100);

      lastQry = qry;

      dgvResult.DataSource = qry.ToList();
   }
}

private void RefreshResult()
{
   using(var ctx = new entityContex())
   {
      if(lastQry != null)
      //here is the Error ! <<---------------->>
      dgvResult.DataSource = lastQry.ToList();
   }
}
4

2 に答える 2

1

1 つの方法は、クエリを実行するデリゲートを作成して保存することです。

Func<entityContex, IQueryable</*Table1 type*/>> queryExecutor = null;

private void SearchMethod()
{
   using(var ctx = new entityContex())
   {
      queryExecutor = c => c.Table1.Where(t=> t.Name.StartWith(txtName.Text)).Take(100);

      var qry = queryExecutor(ctx);

      dgvResult.DataSource = qry.ToList();
   }
}

private void RefreshResult()
{
   using(var ctx = new entityContex())
   {
      if(queryExecutor != null)
      dgvResult.DataSource = queryExecutor(ctx).ToList();
   }
}
于 2013-08-16T11:14:17.943 に答える
0

を保存するのではなくIQueryable、リストを保存します。

List<Table1> lastQry = null;

private void SearchMethod()
{
 using(var ctx = new entityContex())
 {
   var qry = 
     ctx.Table1
       .Where(t=> t.Name.StartWith(txtName.Text))
       .Take(100)
       .ToList(); // <--

   lastQry = qry;
   dgvResult.DataSource = qry;
 }
}

private void RefreshResult()
{
  using(var ctx = new entityContex())
  {
    if(lastQry != null)
      dgvResult.DataSource = lastQry;
  }
}
于 2013-08-14T06:29:13.720 に答える