【问题标题】:Reduce the number of queries in EF减少 EF 中的查询次数
【发布时间】:2009-06-30 14:22:18
【问题描述】:

我有以下型号:

实体:

  • 产品(包含基本数据 产品:价格等)
  • 属性(包含所有可能的可选属性的数据)
  • ProductAttribute(包含产品可选属性的数据,例如。 颜色、型号、尺寸)。产品属性 本质上是多对多 与有效载荷的关系(ProductId, 属性ID、值)

还有这段代码:

private static void ListAttributes(Product p)
{
    p.ProductAttributes.Load();
    foreach (var att in p.ProductAttributes)
    {
        att.Attribute.load();
        Console.WriteLine("\tAttribute Name:{0} - Value {1}", 
           att.Attribute.Name,
           att.AttributeValue);
    }
}

每次在 foreach 循环中调用 att.Attribute.Load() 方法时,这段代码都会触发一个查询,只有这样我才能显示属性的名称。 我想获取 Attribute.Name 以及获取所有属性值的查询,即加入 ProductAttribute 和 Attribute。 有没有办法在我的方法中实现这一点?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    您似乎在 EntityObject 周围有一个包装器,可以自行执行每个实体的加载。

    如果你想保持这种结构。我认为您需要做的是重载 ProductAttributes.Load() 方法以接受枚举或其他内容。然后在该 Load 方法中,您可以执行 Linq-to-Entity 或 Entity-SQL 查询连接并为您包含属性。

    var query = from c in context.Product.Include("Attributes");
    

    【讨论】:

    • 我的 p.ProductAttributes.Load(); 没有问题部分。这将为每个产品启动一个查询,数量级为数十。问题在于 att.Attribute.load();因为这个会以 100 的顺序启动 sql 查询。此外,使用 att.Attribute.IsLoaded 属性将减少不必要的查询数量,但这仍然不是最佳选择。
    • 对我来说,没有办法使用 att.Attribute.load() 方法。因为它是一个“孩子”。它不知道它的兄弟属性。如果您使用“父”加载方法 (p.ProductAttributes.Load()),则可以使该加载方法在单个方法调用中填充产品和属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2020-08-16
    • 2011-06-09
    相关资源
    最近更新 更多