1

私はEntity Frameworkを使用してVS2008にいます。WHERE IN 機能に esql を使用して、データベースからオブジェクトにアクセスしています。大量の ID を select ステートメントに渡しているので、それを 800 個のセットにチャンクします。次に、各チャンクの結果をマージします。私の目標は、同期的に待機するのではなく、各チャンクの結果を並行して取得することです。Reactive Framework をインストールしましたが、ForkJoin を使用する必要があると確信しています。ただし、この関数を変換して使用する方法がわかりません。これが私の既存のコードです:

    public static IList<TElement> SelectWhereIn<TElement, TValue>(this ObjectContext context, string fieldName, IList<TValue> idList)
    {
        var chunkedIds = idList.Split(CHUNK_SIZE);
        string entitySetName = typeof(TElement).Name + "Set";
        var retList = new List<TElement>();
        foreach (var idChunk in chunkedIds)
        {
            string delimChunk = string.Join(",", idChunk.Select(x => x.ToString()).ToArray());
            ObjectQuery<TElement> query = context.CreateQuery<TElement>("SELECT VALUE x FROM " + entitySetName + " AS x");
            query = query.Where("it." + fieldName + " IN {" + delimChunk + "}");
            retList.AddRange(query);
        }
        return retList;
    }

ありがとう!

編集 >>> 以下のように、貧乏人を使用するようにコードを変更しました。

    public static IList<TElement> SelectWhereIn<TElement, TValue>(this ObjectContext context, string fieldName, IList<TValue> idList)
    {
        var chunkedIds = idList.Split(CHUNK_SIZE);
        string entitySetName = typeof(TElement).Name + "Set";
        var chunkLists = new List<IEnumerable<TElement>>();
        Parallel.ForEach(chunkedIds, idChunk =>
        {
            string delimChunk = string.Join(",", idChunk.Select(x => x.ToString()).ToArray());
            ObjectQuery<TElement> query = context.CreateQuery<TElement>("SELECT VALUE x FROM " + entitySetName + " AS x");
            query = query.Where("it." + fieldName + " IN {" + delimChunk + "}");
            chunkLists.Add(query.ToList());
        });
        var retList = new List<TElement>();
        foreach (var chunkList in chunkLists)
        {
            retList.AddRange(chunkList);
        }
        return retList;
    }

初めてうまくいきました。しかし、2回目に実行すると、次のエラーが発生しました。

接続は閉じられませんでした。接続の現在の状態は接続中です。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.InvalidOperationException: 接続が閉じられませんでした。接続の現在の状態は接続中です。

ソース エラー:

49 行目: foreach (resultList の var iAsyncResult) 50 行目: { 51 行目: del.EndInvoke(iAsyncResult); 行 52: iAsyncResult.AsyncWaitHandle.Close(); 53行目: }

興味深いことに、b/c Emre (ライブラリの作成者) は元の投稿を編集して、安全性を高めるためにこれらのコード行をどのように追加したかについて語っています。私はそれを正しく使用していますか?それとも、結局のところ、v1 の方が安全だったのでしょうか?

4

1 に答える 1