3

TopicCountブール値を受け入れると呼ばれるアプリケーションのコード優先エンティティに単純なメソッドを追加しました。ナビゲーション プロパティ内の項目数をカウントし、渡されたブール値が true か false かに基づいてカウントを異なる方法でフィルター処理します。

public class Board
{
    public short BoardID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public bool Hidden { get; set; }
    public bool ModsOnly { get; set; }
    public bool Locked { get; set; }
    public bool Anonymous { get; set; }
    public bool AllTopics { get; set; }

    public virtual ICollection<Topic> Topics { get; set; }

    public long TopicCount(bool isModerator)
    {
        if (isModerator)
            return this.Topics.ToList().Count;
        else
            return this.Topics
                .Where(x => !x.ModsOnly)
                .Where(x => !x.Board.ModsOnly)
                .Where(x => !x.Board.Hidden)
                .Count();
    }
}

このTopicCountメソッドを呼び出すと、(bool が true か false かに関係なく) 次のエラーで失敗します。

このコマンドに関連付けられた開いている DataReader が既に存在し、最初に閉じる必要があります。

何か案は?

4

2 に答える 2

4

これは、単一のコンテキストで複数のコマンドの結果をストリーミングすることの症状でもあります (遅延読み込み)。これを回避するには、接続文字列で「MultipleActiveResultSets=True」を設定します。

于 2012-09-20T21:18:59.567 に答える
3

自分自身の問題を解決した中で最速だと思います。遅延ロードされたBoardエンティティのコレクションを繰り返し処理していたことがわかりました。その繰り返しの中で、別のデータ リーダーである Board のナビゲーション プロパティを繰り返し処理していました。

簡単な修正は.ToList()、ボードのコレクションを呼び出して、メモリ内のコレクションを反復処理することでした。

于 2012-09-20T18:36:55.707 に答える