1

我正在努力使实体框架项目更具可扩展性以满足我们的要求。该项目使用 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 属性的方法,就像它对其余产品数据所做的那样。

如果我没有提供足够的信息,请原谅我。我是实体框架的新手,我真的不确定要回答这个问题需要什么。

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 回答