0

正規化されたデータベースで EF を使用しています。

私の Offers エンティティには、次のテーブル構造があります。

オファー

プラス次のいずれか:

投稿タイプ

Offers_SitePost または Offers_CommunityPost

プラス次のいずれか:

オファータイプ

Offers_VoucherCode または Offers_Deal または Offers_Sale

したがって、完全なオファーは、Offers の明確なエントリに加えて、PostType テーブルの 1 つのエントリと、OfferType テーブルの 1 つのエントリで構成されます。

他のどのテーブルにデータを含める必要があるかは、offers テーブルからわかります。これを行うために IsSitePost のようなプロパティを使用しています。

単一のオファーとオファーのリストの両方について、必要なデータだけを取得する最善の方法を見つけようとしています。明らかに、すべてのテーブルを含めることができますが、これが最も効率的であるとは思えません。

単一のオファーのために取り組んでいるコードは次のとおりです。

    public static Offer GetById2(int ID)
    {
        ID.ThrowDefault("ID");

        var r = new CrudRepo<Offer>(Local.Items.Uow.Context);

        var offer = r.Find(o => o.OfferId == ID);

        // if is site post Include("SiteOffers")
        // else is community post Include("CommunityOffers") etc

        return offer.SingleOrDefault();
    }

これを達成するための最善の方法についてアドバイスを提供できる人はいますか?

4

2 に答える 2

1

探しているオファーについてDBにクエリを実行することをお勧めします

このトピックを見てください: Entity Framework 4: 単一レコードの選択

于 2012-10-09T10:29:18.533 に答える
0

includeはオブジェクトタイプではなく、基になるテーブルソースを拡張するため、検索の前に.Includeを配置する必要があります。これは、CrudRepoを実装する方法と、リポジトリがInclude自体を処理する方法を知っているかどうかを知るために何を返すかにも依存します。

public static Offer GetById2(int ID)
 {
     ID.ThrowDefault("ID");
      var r = new CrudRepo<Offer>(Local.Items.Uow.Context);
      if (IsSitePost)
         r = r.Include("SiteOffers");
      else
         r = r.Include("CommunityOffers");
      var offer = r.Find(o => o.OfferId == ID);
      return offer.SingleOrDefault();
 } 
于 2012-10-09T14:13:53.807 に答える