私は次のようなEFモデルの一部です。
概要:
- 場所には多くの投稿があります
- Postは抽象クラスです
- ディスカッションは投稿から派生します
- ディスカッションには多くのコメントがあります
今、私が達成しようとしているクエリ:
それらのディスカッションに関連するディスカッションやコメントなど、ロケーションID1234に関する情報を取得します。
私はこのような議論とコメントを得ることができます:
var discussions = ctx.Posts
.OfType<Discussion>()
.Include(x => x.Comments)
.ToList();
しかし、 LocationエンティティのPostsナビゲーションに基づいて取得できないようです。
私はこれを試しました:
var locationWithDiscussionsAndComments = ctx
.Locations
.Include(x => x.Posts
.OfType<Discussion>()
.Select(y => y.Comments))
.SingleOrDefault();
どちらがコンパイルされますが、エラーが発生します:
System.ArgumentException:インクルードパス式は、エンティティによって定義されたプロパティを参照する必要があります。オプションで、ネストされたプロパティまたはSelectの呼び出しも参照する必要があります。パラメータ名:パス
何か案は?私はおそらく投稿から「後方」に行くことができます:
var locationWithDiscussionsAndComments = ctx
.Posts
.Include(x => x.Location)
.OfType<Discussion>()
.Include(x => x.Comments)
.Where(x => x.LocationId == 1234)
.Select(x => x.Location)
.ToList();
しかし、それは私のリポジトリの観点からは厄介で意味的に間違っています(場所に関する情報を取得するために投稿リポジトリを通過する必要はありません)。
何か案は?
編集
それで、それについてもっとよく考えた後、私はそれOfType<T>
がフィルター操作であることに気づきました。ご存知のように、EFは積極的な読み込みによるフィルタリングをサポートしていません。唯一のオプションは、すべてを取得するか、匿名タイプの射影を使用することです。
メタデータが多すぎるため、すべてを取得することはできません。だから私は匿名型の投影を試みています。