2

大量のドロップダウンと繰り返しリストを使用するシステムを開発しています。したがって、コードの繰り返しを避けるために を作成しましたDropDownManagerClass()。これにより、システムのどこからでも Customers ドロップダウンを呼び出すことができます。

public class DropDownManager:BaseManagerClass
{
    public DropDownManager(String connectionString)
        : base(connectionString)
    {
    }

    public IEnumerable<SelectListItem> GetCustomerDD()
    {

        this.OpenConnection();

        IEnumerable<SelectListItem> dropDown = this._context.Customers.Select(m => new SelectListItem { Text = m.Description, Value = m.CustomerID.ToString() });

        this.CloseConnection();

        return dropDown;


    }

}

次に、この使い捨てマネージャー クラスを呼び出してモデルにデータを入力します。オブジェクトを破棄して、データベースへの接続をクリーンアップしていることがわかります。

  DropDownManager dropdown = new DropDownManager(Global.ConnectionString);

  IEnumerable<SelectListItem> customers = dropdown.GetCustomerDD();
  IEnumerable<SelectListItem> suppliers= dropdown.GetSuppliersDD();

  model.CustomersDD= customers;
  model.SuppliersDD= suppliers;

  dropdown.Dispose();

デバッグすると、顧客とサプライヤが SQL ステートメントを持っていることに気付きます。したがって、私の見解では、これがSQLを実行してデータを取得しようとしているところだと思いますが、破棄するとdropdownエラーがスローされます。削除するdropdown.Dispose()と、コードが機能します。

私の見解

@Html.DropDownListFor(m => m.Customer.CustomerID, Model.CustomersDD, new { @class = "large" })

モデルにデータを入力して、このマネージャーを効率的に破棄できる方法はありますか?

編集顧客から選択した後に呼び出すと.ToList()、モデルにまだ結果セットが表示されていることがわかりますが、それでもエラーが発生します

4

6 に答える 6

1

これが機能するかどうかはわかりません.Dispose()を手動で呼び出す代わりに、「using」ステートメントを使用してみましたか?

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

于 2013-02-20T14:37:35.267 に答える
1

以下のコードを試していただけますか?ここでの提案と、コードの書き方を組み合わせたものです。

最初にあなたを置き換えますGetCustomerDD()

public List<SelectListItem> GetCustomerDD()
{
    List<SelectListItem> dropDown;
    try
    {
        OpenConnection();

        // .ToList() here makes sure you get the result immidiately
        dropDown = _context.Customers.Select(m => new SelectListItem { Text = m.Description, Value = m.CustomerID.ToString() })
            .ToList();              
    }
    finally
    {   
        // try-finally makes sure you always close your connection
        CloseConnection();
    }
    return dropDown;
}

次に、次のように呼び出します。

using (var dropDownManager = new DropDownManager(Global.ConnectionString))
{  
    // using makes sure the DropDownManager is always disposed
    CustomersDD = dropDownManager.GetCustomerDD();
}

これは機能しますか?

ところで; あなたの投稿ではDropDownManager、接続を閉じるように処分すると述べていますが、コードではthis.CloseConnection()insideとの接続を閉じているようですGetCustomerDD()。何か不足していますか?おそらく、接続を閉じるためにそれを破棄する必要はありませんか?

于 2013-02-21T13:11:18.103 に答える
0

問題は、(後で) 結果の列挙を開始したときにのみクエリが実行されることですが、結果を列挙する前にドロップダウンを破棄すると、後でそれらを列挙しようとすると、既に破棄されているコンテキストに対してクエリが実行され、失敗します。

この問題を回避するには、リクエストを破棄する前に、リクエストの後半でコンテキストを破棄するか、クエリを列挙する (リストを呼び出す) 必要があります。

于 2013-02-15T01:04:29.137 に答える
0

Linq2Entity または Linq2Sql を using ステートメント内で使用する場合 (通常、これを行うための最良の方法)、クエリは実際にデータにアクセスするまで実行されません (バインディング、First、Count、ToList、またはその他のメソッドをフェッチする)データ)。

Utils クラスで ToList() メソッドを呼び出すだけで、結果を「マテリアライズ」できます。外部ではなく、DropdownManagerClass の内部で行うことが重要です。

于 2013-02-21T10:59:52.800 に答える
0

すでに試したことがあるかもしれませんが、INumerable を List に変更しようとしましたか?

List<SelectListItem> customers = dropdown.GetCustomerDD().ToList();
List<SelectListItem> suppliers = dropdown.GetSuppliersDD().ToList();
于 2013-02-17T22:29:52.923 に答える
0

それらをループしてリストに追加することを考えたことがありますか?ビューに渡す前に、データベースにクエリを実行する必要がありますか?

var list = new List<SelectListItem>();

this._context.Customers
    .Select(m => new SelectListItem { Text = m.Description, Value = m.CustomerID.ToString() })
    .ForEach(x => list.Add(x));

本当にただの一般的な考えです。幸運を!

于 2013-02-20T16:49:21.067 に答える