3

最初にすべてのリレーションシップオブジェクトをメモリにロードせずに、多対多のリレーションシップをクエリするための最良の方法を知りたいです。

たとえば、カテゴリと記事には多対多の関係があります。これは、Categoryクラスに(遅延読み込みされた)ナビゲーションプロパティがあることを意味します。

class Category
{
     public long Id {get; set;}
     public ICollection<Articles> Articles {get; set;}
}

表示されている記事のみを選択したい場合は、次のようにナビゲーションプロパティをクエリできます。

category.Articles.Where(a => a.IsVisible)

ただし、私が知る限り、これにより、IsVisibleチェックを実行する前に、関連するすべての記事がメモリに読み込まれます。

関連する記事をメモリにロードせずにクエリすることは可能ですか?つまり、ICollectionではなくIQueryableに作用しますか?これが1対多の関係である場合、Article DbSetに直接クエリを実行して目的を達成できますが、多対多の関係はsqlのリンクテーブルに格納されます。つまり、DbSetを使用してこれをクエリすることはできません。リンクテーブルをクエリする生のSQLを手動で作成する唯一のオプションはありますか?

4

1 に答える 1

6

これが1つの方法です:

var visibleArticlesQuery = context.Category.Where(c => c.Id == category.Id)
                                           .SelectMany(c => c.Articles)
                                           .Where(a => a.IsVisible);

たとえば、を使用してArticleDbSetをクエリすることもできますContains

于 2012-10-24T14:43:10.157 に答える