Datatable 에서 Linq문으로 select 시 object disposed 오류 현상

안녕하세요, 자주 linq문을 이용하여 dt를 필터링하는데, where문에 변수가 들어갈시, 특정 상황에서 자주 object disposed 오류가 납니다.
예를들어…

dt_temp.AsEnumerable.Where(Function(x) x.field(Of String)(“발주번호”).Equals(dic_target(key).Values.FirstOrDefault()))
EnumerableRowCollection { ! … }

원인을 알수 있을까요? dt_temp는 존재하고, 발주번호 컬럼도 존재하며 , dic_target도 존재합니다.

dic_target은 dic(of string , dic(of string,string)) 이고요.

이 경우 이외에도

dt_temp.AsEnumerable.Where(Function(x) x.field(Of String)(“컬럼명”).Equals(변수명))

이런 류의 linq문에서 저 오류가 많이 발생합니다.

dic_target(key).Values.FirstOrDefault()
의 값은 “61578807” 이고 같은

dt_temp.AsEnumerable.Where(Function(x) x.field(Of String)(“발주번호”).Equals(“61578807”))을 하면 정상적으로 값이 출력됩니다. 이런경우가 엄청많네요

提供された情報に基づくと、LINQ を使用して、Where 句の特定の変数を使用して DataTable (dt_temp) をフィルターしているようです。発生したエラーは、DataTable または別の関連オブジェクトの破棄に関連している可能性があります。

このエラーは散発的に発生するため、問題は LINQ ステートメントの実行時の「dt_temp」または他のオブジェクトの状態に関連している可能性があります。このエラーが発生する一般的な理由は次のとおりです。

  1. 破棄された DataTable: LINQ クエリの前または実行中に、dt_temp または別の関連オブジェクト (dic_target) がコード内の別の場所で破棄または変更されている場合、「ObjectDisowned」エラーが発生する可能性があります。 DataTable またはその基礎となるオブジェクトを途中で破棄しないようにしてください。

  2. Null 参照: LINQ クエリは、dt_temp または dic_target(key).Values.FirstOrDefault() が null の場合に実行され、NullReferenceException が発生する可能性があります。 LINQ クエリで null 値を使用する前に、必ず null 値をチェックしてください。

  3. マルチスレッド/並列処理: コードでマルチスレッドまたは並列処理を使用している場合、競合状態が問題の原因となっている可能性があります。データの整合性を確保するには、ロックや同時収集などの同期メカニズムを使用する必要があります。

  4. データ型の不一致: 比較している列のデータ型 ("발주번호") と比較対象の変数 (dic_target(key).Values.FirstOrDefault()) に互換性があることを確認します。

  5. 文化に依存した比較: 文字列比較に「Equals」を使用すると、文化に依存したデータの場合に予期しない結果が生じる可能性があります。このような問題を回避するには、比較オプションを指定して String.Equals を使用することを検討してください。

さらに役立つように、「dt_temp」、「dic_target」、およびその他の関連オブジェクトがコード内でどのように使用および変更されているかについて、より詳しいコンテキストを確認すると役立ちます。さらに、スタック トレースとエラー メッセージの内部例外の詳細を確認して、問題の根本原因をさらに詳しく調べてください。

補足として、指定した LINQ ステートメントは VB.NET 構文であるようで、列の値に基づいて行をフィルターするために使用されます。 LINQ クエリで使用している列名 (「발주번호」 または "컬럼명") が DataTable 内の実際の列名 (dt_temp) と一致していることを確認してください。

HI,

It may be caused by deferred execution. Can you try to handle it as datarow array as the following?

arrDr = dt_temp.AsEnumerable.Where(Function(x) x.field(Of String)(“발주번호”).Equals(dic_target(key).Values.FirstOrDefault())).ToArray()

note : arrDr is datarow array type.

Regards,


image
image

this is exception that occured at other code block

저는 쿼리형 위주로 사용하는데 쿼리형에서도 동일한 현상이 발생합니다

그런데 select 를 안쓰면 발생하고 select를 쓰면 해결 됐던거 같습니다

함수형은 잘 안써서 모르겠네요