1

私は、エンティティフレームワークプロジェクトを要件に合わせてよりスケーラブルにすることに取り組んでいます。このプロジェクトでは、EDMXファイル、Entity Framework、および.NET4.0を使用しています。プロジェクトには、遅延読み込みがグローバルに設定されています。

基本的に、2つのテーブルがあります。

Product
  ProductId

ProductVariant
  ProductVariantId
  ProductId

特定の製品のProductVariantに数十万の関連する行がある状況があります。そこで、ProductVariantのナビゲーションプロパティを削除し、関連するすべてのデータではなく、最も関連性の高いデータのみを検索するクエリを作成したいと思います。

ただし、ほとんどのコードは次のようなことを行います。

if (Product.HasVariants) { [Loop Through Variants And Do Something] }

これに変更します:

if (Product.HasVariants) { [Lookup Subset of Variants from DB And Do Something] }

HasVariantsは、現在次のようなメソッドです。

public bool HasVariants()
{
    return this.Variants.Count > 0;
}

Variantsはナビゲーションプロパティです。私がやりたいのは、コードがこのチェックを行うたびにデータベースを呼び出すのではなく、バリアントテーブルに関連データが存在するかどうかを示すフィールドを使用してルックアップクエリを作成することです。

これは、ストアドプロシージャでこれを実現する方法です。

CREATE Procedure GetProduct
  @ProductId
AS

Declare @HasVariants bit

Set @HasVariants = EXISTS(Select ProductVariantId 
                          From ProductVariant 
                          Where ProductId = @ProductId)

SELECT ProductId, <Other Fields>, @HasVariants AS HasVariants
FROM Product
WHERE ProductID = @ProductID

Return

コレクションの代わりにHasVariantsメソッドで使用するHasVariantsフィールドの存在に注意してください。

私の質問は、EDMXベースのモデルを使用して同じこと(関連するテーブルからのルックアップフィールド)をどのように達成するかです。コードでSQLステートメントを使用せずにこれを実行したいのですが、解決策にHasVariantsをナビゲーションプロパティにすることが含まれている場合(可能ですか?)、それは許容されます。オンデマンドで実行するクエリを作成する方法をすでに理解しています。私が探しているのは、エンティティフレームワークが残りの製品データに対して行うのと同じ方法でHasVariantsプロパティをキャッシュする方法です。

十分な情報を提供しなかった場合はご容赦ください。私はEntityFrameworkを初めて使用しますが、この質問に答えるために何が必要か本当にわかりません。

4

1 に答える 1

2

ストアドプロシージャを複製する場合は、新しいクラスを作成して、次のようなものを実装する必要があります。

public IQueryable<ProductWithHasVariant> GetProduct(DBContext context, int productId)
{
  return from p in context.Products
         where p.ProductId == productId
         select new ProductWithHasVariant
         {
           p.ProductId,
           HasVariants = p.Variants.Any(),
           .
           .
           .
         };
}
于 2012-04-08T01:47:51.103 に答える