7

最初に EF 4.3 コードを使用しており、次のようなオブジェクト モデルがあります。

class Content {  }

class Product:Content { }

class News:Content { }

これらは、タイプごとにテーブルとしてマッピングされます。

すべてのコンテンツ タイトルのリストなど、ベース テーブルに属する列のみをロードしたいシナリオがあります。しかし、次のようなクエリ

from c in Content
where c.IsDeleted == false
select c

他の2つのテーブルへの結合を伴う、非常に厄介なSQLが発生します。他のテーブルに結合せずに、ベース テーブルからのみ選択を行うように EF を強制する方法はありますか?

4

1 に答える 1

3

TPT には問題があり、EF で生成されたクエリは通常非常に非効率的です。さらに、あなたの期待はおそらく間違っています。Linq-to-entities は常に実体型を返します。Contentレコードが実際にProductエンティティである場合、型のインスタンスを返すことはできません。クエリには次の 2 つの意味しかありません。

  • 削除されていないすべてのコンテンツを返します。実際のタイプのエンティティを正しくインスタンス化するには、結合を実行する必要があります。Contentクエリは、ProductおよびNewsインスタンスの列挙を返します。
  • 削除されていないすべてのインスタンスを返します。これは、直接 ( および に関係なく)にContentマップされたレコードのみを正しくインスタンス化するために、おそらく再び結合を実行する必要があります。列挙にマッピングされたレコードはありません。このクエリは、Linq-to-entities では使用できません。ESQL と演算子を使用する必要があります。ContentProductNewsProductNewsOFTYPE ONLY

あなたが試すことができるいくつかのことがあります:

  • .NET 4.5 へのアップグレード - TPT クエリが改善されました
  • Content-の代わりにプロパティのプロジェクションを返し、コンテンツでもあるため、Linq-to-entities クエリからインスタンスを返す場合、結合なしでクエリを取得することはありProductませんNewsContent
于 2012-07-17T09:22:05.240 に答える