我正在努力使实体框架项目更具可扩展性以满足我们的要求。该项目使用 EDMX 文件、实体框架和 .NET 4.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;
}
变体是一个导航属性。我想做的是创建一个查找查询,其中包含一个指示变量表中是否存在任何相关数据的字段,而不是每次代码执行此检查时都调用数据库。
这就是我在存储过程中完成此操作的方式:
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 属性的方法,就像它对其余产品数据所做的那样。
如果我没有提供足够的信息,请原谅我。我是实体框架的新手,我真的不确定要回答这个问题需要什么。