2012-03-13 14 views
2

1つのプロジェクトにDLLを書き込むと、LINQをSQLに使用し始めました。私は理由を理解するが、私は私が私のメインのプロジェクトメソッドのクエリの結果をアセスすることができますかわからないんだけど、それが配置されたので、私はDataContextのをアセスすることができないことをdisovered:LINQ to SQLはDataContextの後にクエリを使用します。

DLL

public static IEnumerable<Problem> GetProblemsNewest(int howMuch) 
     { 
      using (ProblemClassesDataContext context = new ProblemClassesDataContext()) 
      { 
       var problems = (from p in context.Problems orderby p.DateTimeCreated select p).Take(howMuch); 

       return problems; 
      } 
     } 
で私の方法それを呼び出す

IEnumerable<Problem> problems = ProblemsManipulation.GetProblemsNewest(10); 
//Error can't acess it because it was disposed.. 

これがちょうど最初の方法ですが、私はので、私は本当にこれを行う方法を必要とする大規模なものを持っています。 DLLにLINQ to SQLを使用する方法が必要ですか? .ToListまたは.ToArrayのように何かできることは分かっていますが、行のプロパティに直接アクセスできず、問題[0]、問題[1]などとして参照する必要があります。メインプロジェクトのコード

答えて

7

usingステートメントの外にいると、コンテキストは自動的に破棄されます。したがって、IEnumerableが実際に列挙されると、コンテキストは既に破棄されています。

したがってLinqに、実際にはusingステートメントの内部でDBから値を取得するように指示する必要があります。あなたはToList()またはToArray(または他のもの)によってそうすることができます。あなたが使用してブロックを終了する前にIEnumerableを上.ToList()を実行して、それを扱うことができる

public static IList<Problem> GetProblemsNewest(int howMuch) 
{ 
    using (ProblemClassesDataContext context = new ProblemClassesDataContext()) 
    { 
     var problems = (from p in context.Problems orderby p.DateTimeCreated select p).Take(howMuch); 

     return problems.ToList(); 
    } 
} 
+0

だから私はちょうどdllでそれを処分し、メインプロジェクトの最初のメソッドでImを済ませた後に呼び出すメソッドを書くべきですか? – formatc

+0

いいえ、コンテキストが長い期間存在することを意味するものではなく、代わりに提案されたソリューションを使用してください – ntziolis

1

は、更新されたコードを参照してください。これにより、レコードが取得され、リストに入力されます。これに

return problems; 

:これはしかし、パフォーマンスの面で最適ではない可能性がありますあなたのシナリオに応じて

4

変更するには、この(あなたは怠惰な検索とクエリの追加フィルタリングの可能性を失う)

return problems.ToList(); 

説明

ToListメソッド()らの結果を反復処理し、それらを引っ張ってきますlをメモリに格納します。これはusingステートメントの内部で発生するため、うまくいきます。リストを作成するので、値が返されます。

これは他の方法でも実行できます。基本的な考え方は、usingステートメントが閉じる前に実際に結果を取得することです。

代わりの解決方法は、usingステートメントを避け、オブジェクトを所有するイテレータを作成し、最後のアイテムが過去に反復されたときに破棄することです。

1

あなたが使用してコンテキストを使用したくないかもしれない...など、)(

0

を使用して、WHERE句内のクエリを終えるすなわちToListメソッド()またはファーストを(使用)またはカウントする必要があります。関連するデータを読み込もうとしたときに、同じ「オブジェクト廃棄」問題が発生するため、後でナビゲーションプロパティを使用することはできません。あなたがしなければならないことは、コンテキストを生き生きとさせ、結果を直接返すことです。または、結果を返すときは、ToList()と呼び出し、後ですべての関連データを照会します。

1

現在、クエリを返すと、データベース接続があなたの用法の前に閉じているので、それを使用するとき、あなたは例外が発生しますが、ちょうど行います

return problems.AsEnumerable() 

は、これは、LINQのdeffered execution方法です。実際にはあなたのproblemsオブジェクトは単なるクエリなので、それをオブジェクトに変換して別の場所で使用する必要があります。

関連する問題