0

私は自分のデータベースにObjectobject を持っていますOwnerOwnerには文字列がありますNameObjectobject も保持しますDetails

私はObject、それDetailsは 、そしてが必要Owner.Nameです。Ownerオブジェクト全体をロードしないようにしたい(詳細はこちら)。単一のデータベース クエリのみが必要です。

私は試した:

DataContext.Objects.Select(o => new { Object = o, OwnerName= o.Owner.Name })
           .Include(o => o.Object.Details);

しかし、それはスローします:

System.InvalidOperationException: 'クエリの結果の型は、エンティティ要素型を持つ EntityType でも CollectionType でもありません。インクルード パスは、これらの結果の種類のいずれかを持つクエリに対してのみ指定できます。

Includeまた、前に呼び出してみましたSelect:

var d = DataContext.Objects.Include(o => o.Details)
.Select(o => new { Object = o, OwnerName= o.Owner.Name });

Includeしかし、これは、つまりを無視します。アクセスd.DetailsするとDBクエリが発生します。

何か案は?

4

2 に答える 2

0

EF に存在する問題に触れています。

問題は、EF がデータの読み込みを処理する方法にあります。オブジェクトのすべてのスカラー プロパティを読み込みますが、ナビゲーション プロパティは読み込みません。

Include指定されたナビゲーション プロパティ (すべてのスカラー プロパティを含む)含めるように EF に指示することで、この動作に影響を与えます。

しかし、その後、 になりSelectます。これを使用すると、本質的に、取得したい列の固定リストを提供することになります。これは、すべてのスカラー プロパティをロードするデフォルトの動作をオーバーライドし、残念ながら、Include追加したステートメントもオーバーライドします。


最も簡単な解決策は、詳細を取得するように EF に明示的に指示することです。

var d = DataContext.Objects.Include(o => o.Details)
    .Select(o => new { 
               Object = o, 
               ObjectDetails = o.Details,
               OwnerName= o.Owner.Name 
    });

余談ですが、 EF が取得する必要がある列が明示的に示されているため、ステートメントはもう Select必要ありません。Include

o.Owner.Nameこの動作は、実際に を呼び出さずに取得することですでに確認できますInclude(o => o.Owner)

于 2018-05-07T11:23:20.360 に答える