1

DB から多くのレコードをロードしようとしていますが、それらを並行して実行して速度を上げたいと考えています。

以下は、null である Applicants プロパティにアクセスしようとすると壊れるコードの例です。ただし、非並列ループでは、Applicants プロパティは設定されているか空のリストですが、null になることはありません。遅延読み込みは確実に有効になっています。

var testList = new List<string>();

Context.Jobs
                .AsParallel()
                .WithDegreeOfParallelism(5)
                .ForAll(
                    x => testList.Add(x.Applicants.Count().ToString())
                );

このようなことはできますか?エンティティ フレームワーク接続に関連していますか? 並列に使いやすくして、そのインスタンスをタスクなどに渡すことはできますか? 私はアイデアを出しているだけですが、実際には手がかりがありません。

編集:

この投稿は私と関係がありますか? 私の問題は似ているように聞こえます。Entity Framework の遅延読み込みが他のスレッドから機能しない

4

1 に答える 1

2

PLINQ には、LINQ-to-SQL および LINQ-to-Entities クエリを並列化する方法はありません。したがって、AsParallelEF を呼び出すときは、最初にクエリを具体化する必要があります。

さらに、データベースで実行されるクエリを並列化しても意味がありません。データベース自体が並列化できるからです。

ただし、クライアント側のものを並列化したい場合は、以下のコードが役立つ場合があります。

Context.Jobs
.Select(x => x.Applicants.Count().ToString())
.AsParallel()
.WithDegreeOfParallelism(5)
.ForAll(
           x => testList.Add(x)
       );

クエリが具体化される前にのみ、ナビゲーション プロパティにアクセスできることに注意してください。(あなたの場合はAsParallel()電話する前に)。したがって、必要Selectなものをすべて取得するために使用してください。

Context.Jobs
.Select(x => new { Job = x, Applicants = x.Applicants })
.AsParallel()
.WithDegreeOfParallelism(5)
.ForAll(
       x => testList.Add(x.Applicants.Count().ToString())
   );

Includeメソッドを使用して、クエリの結果にナビゲーション プロパティを含めることもできます...

Context.Jobs
.Include("Applicants")
.AsParallel()
.WithDegreeOfParallelism(5)
.ForAll(
       x => testList.Add(x.Applicants.Count().ToString())
   );
于 2013-01-19T20:06:07.577 に答える