2

私はこのコードを持っています:

list = _dataContext.myTable
    .Where(row => row.Label.Contains(myText))
    .OrderBy(row => row.Label)
    .Select(row => new MyClass
    {
        Field1 = row.Field1,
        Field2 = row.Field2,
        Field3 = row.Field3
    }).ToList<IMyClass>();

list = _dataContext.myTable
    .OrderBy(row => row.Label)
    .Select(row => new MyClass
    {
        Field1 = row.Field1,
        Field2 = row.Field2,
        Field3 = row.Field3
    }).ToList<IMyClass>();

ご覧のとおり、コードが重複しています。次に、これを行います:

private List<IMyClass> CreateObject(IOrderedQueryable<myTable> list)
{
    return list.Select(row => new MyClass
    {
        Field1 = row.Field1,
        Field2 = row.Field2,
        Field3 = row.Field3
    }).ToList<IMyClass>();            
}

result = _dataContext.myTable
    .Where(row => row.Label.Contains(myText))
    .OrderBy(row => row.Label);
var finalList = CreateObject(result);

これを行うと、「Linq 2 SQL プロファイラー」で次の警告が表示されます。

複数のスレッドで単一のデータ コンテキストを使用することは、おそらくバグです。

CreateObjectメソッドを使用する場合にのみこれを持っています

何か案は?

4

4 に答える 4

1

必要以上に複雑にしているようです。次のようなことをした方が良いかもしれません:

// If suspendFilterByMyText is true, the Where() call will always return true.
bool suspendFilterByMyText = true;
list = _dataContext.myTable
    .Where(row => (suspendFilterByMyText || row.Label.Contains(myText)))
    .OrderBy(row => row.Label)
    .Select(row => new MyClass
    {
        Field1 = row.Field1,
        Field2 = row.Field2,
        Field3 = row.Field3
    }).ToList<IMyClass>();

このアプローチはどちらの場合にも機能します。suspendFilterByMyText適切に設定するだけです。これをメソッドにラップすると、このコードを 1 回記述するだけで済みます。

于 2012-04-23T07:40:42.433 に答える
0

さてこれがあります:

http://l2sprof.com/Learn/Alerts/CrossThreadSessionUsage

簡単に言えば、これらのメソッドを宣言してアクセスしているクラスが正しく同期されている場合は、このメッセージを無視できます。_dataContextはアセンブリに対してグローバルですか、それともクラス内で定義されていますか?そして、あなたのメソッドがあなたが期待する順序で呼び出されていると確信していますか?

于 2012-04-23T07:33:53.963 に答える
0

次のリンクを参照してください : http://l2sprof.com/Learn/Alerts/CrossThreadSessionUsage

「Linq to Sql Profiler が、開いたスレッドとは別のスレッドで使用されているデータ コンテキストを検出しました」と表示されます。しかし、あなたが説明したコードにはスレッド化コンテキストがありません。何か不足していますか?

于 2012-04-23T09:15:19.410 に答える
0
using a single data context in multiple thread is likely a bug.

これは単なる警告であり、エラーではなく、正しいです。linq クエリは、結果を使用するか、linq クエリで ToList または ToArray などのメソッドを呼び出した場合にのみ実行されるためです。

したがって、あなたの場合、 DataContext は、CreateObject呼び出し時にメソッドでアクセスされます.ToList()

警告は単に無視できます。そうしないと、コードを複製したままにしておく必要があります。

于 2012-04-23T07:46:37.337 に答える