簡體   English   中英

如何使用3來優化實體框架查詢

[英]How to optimise an Entity framework query with 3 includes

我在.Net 4上使用EF 5

我有以下模型:

public class Order
{

    [Key]
    public int Id { get; set; }
    public string OrderId { get; set; }

    public Address BillingAddress { get; set; }
    public Address DeliveryAddress { get; set; }
    public ICollection<OrderLine> OrderLines { get; set; }
}

public class OrderLine
{
    [Key]
    public int Id { get; set; }

    public string Description { get; set; }
    public decimal UnitPrice { get; set; }
    public int Quantity { get; set; }
    public string SKU { get; set; }
    public decimal ShippingCost { get; set; }
    public decimal Tax { get; set; }
}

public class Address
{
    [Key]
    public int Id { get; set; }
    public string Addressee { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string AddressLine3 { get; set; }
    public string Town { get; set; }
    public string County { get; set; }
    public string Country { get; set; }
    public string Postcode { get; set; }
}

和型號配置:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>().HasMany(x => x.OrderLines).WithRequired().WillCascadeOnDelete();
    modelBuilder.Entity<Order>().HasOptional(x => x.BillingAddress).WithOptionalDependent().WillCascadeOnDelete();
    modelBuilder.Entity<Order>().HasOptional(x => x.DeliveryAddress).WithOptionalDependent().WillCascadeOnDelete();

    base.OnModelCreating(modelBuilder);
}

當我運行以下查詢時,我得到帶有19個Join的 sql,對於簡單的關系而言似乎過多

context.Orders
       .Where(x => x.OrderId == orderId)
       .Include(x => x.OrderLines)
       .Include(x => x.BillingAddress)
       .Include(x => x.DeliveryAddress)
       .FirstOrDefault();

難道我做錯了什么? 格式化linq查詢以優化生成的SQL是否有其他格式?

編輯:

這是實際的查詢: https : //gist.github.com/4278014

我認為問題在於帳單和收貨地址上的WithOptionalDependent 即使將表設置為1:1:1關系,這也會在地址和順序之間創建1:1關系。

如果將配置更改為使用WithMany

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>().HasMany(x => x.OrderLines).WithRequired().WillCascadeOnDelete();
    modelBuilder.Entity<Order>().HasOptional(x => x.BillingAddress).WithMany().WillCascadeOnDelete();
    modelBuilder.Entity<Order>().HasOptional(x => x.DeliveryAddress).WithMany().WillCascadeOnDelete();

    base.OnModelCreating(modelBuilder);
}

查詢要簡單得多,基本上等同於:

...
FROM [Orders]
LEFT OUTER JOIN [Addresses] As B ON [Orders].[BillingAddress_Id] = B.[Id]
LEFT OUTER JOIN [Addresses] As D ON [Orders].[DeliveryAddress_Id] = D.[Id]
LEFT OUTER JOIN [OrderLines] ON [Orders].[Id] = [OrderLines].[Order_Id]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM