4

私はまだEF(v4.1)にかなり慣れていないので、間違っている場合は修正してください。ただし、次のようにInversePropertyがある場合:

public virtual ICollection<ItemComment> Comments { get; set; }

プロパティがアクセスされると、これは遅延ロードされます。ただし、このリストをフィルター処理する場合 (たとえば、アクティブなコメントのみを取得する場合) は、次のように別のプロパティを追加するだけです。

public IEnumerable<ItemComment> ActiveComments {
    get { return Comments.Where(x => x.IsActive); }
}

ただし、これは最初に Comments コレクション全体をロードしてから、正しくフィルタリングしますか? では、IQueryable を使用していませんか? パフォーマンスのために、理想的には IQueryable を使用してリストを取得したいと考えています。

だから私の質問は、これはこのようなエンティティのプロパティを使用して行うことができますか? それとも、ItemComments の where を直接実行する必要がありますか?

var comments = itemCommentRepository.QueryAll()
    .Where(x => x.IsActive && x.ItemId == XX).

これは明らかに機能します...しかし、今後はもっと良い解決策があるのでしょうか?

更新: 結果セット全体がロードされているようで、フィルタリングはデータセット全体のクライアント側で行われます。ハッキング、またはエンティティを変更してコンテキストを渡す (うん!) 以外に、組み込みの方法はないようです。@Slauma の応答を回答としてマークしました。

4

1 に答える 1

2

これは最初にコメント コレクション全体をロードしてから、正しくフィルタリングしますか?

はい。

エンティティのプロパティを使用してこれを行うことができますか

理論的には、エンティティ コンストラクターにリポジトリまたはコンテキストを注入することによって。ただし、POCO エンティティはデータ アクセス レイヤーに依存します。私はこの解決策が好きではありません。

あなたが提案した解決策は方法です。または、明示的な読み込みを使用することもできます。

itemRepository.LoadActiveComments(item);

次のように実装します。

void LoadActiveComments(Item item)
{
    context.Entry(item).Collection(i => i.Comments).Query()
        .Where(c => c.IsActive).Load();
}
于 2012-11-16T16:15:41.543 に答える