私は、エンティティフレームワークプロジェクトを要件に合わせてよりスケーラブルにすることに取り組んでいます。このプロジェクトでは、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を初めて使用しますが、この質問に答えるために何が必要か本当にわかりません。