我有兩個的ViewModels:爲什麼我的一對多查詢如此慢以及Linq到實體?
public class ProductViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public List<PartViewModel> Parts { get; set; }
}
public class PartViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
我查詢這樣的數據庫,以獲得產品的列表,以及相關的零部件一起:
var prods = _context.Products.Select(pr => new ProductViewModel
{
Id = pr.Id,
Name = pr.Name,
Parts = pr.Parts.Select(prt => new PartViewModel
{
Id = prt.Id,
Name = prt.Name
}).ToList()
}).ToList();
有〜8800條記錄中產品表和Part表中只有1條記錄。該查詢需要將近4分鐘才能運行。當我刪除零件列表如下:
var prods = _context.Products.Select(pr => new ProductViewModel
{
Id = pr.Id,
Name = pr.Name
}).ToList();
...大約需要4秒。
下面是在數據庫中,通過代碼首先EF創建我的表定義(我確信顯示的索引,是這可能是一個索引問題:
CREATE TABLE [dbo].[Product](
[Id] [int] NOT NULL,
[Name] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
ALTER TABLE [dbo].[Product] ADD CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Part](
[Id] [int] NOT NULL,
[Name] [nvarchar](max) NOT NULL,
[ProductId] [int] NULL,
CONSTRAINT [PK_Part] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[Part] WITH CHECK ADD CONSTRAINT [FK_Part_Product_ProductId] FOREIGN KEY([ProductId])
REFERENCES [dbo].[Product] ([Id])
GO
ALTER TABLE [dbo].[Part] CHECK CONSTRAINT [FK_Part_Product_ProductId]
GO
CREATE NONCLUSTERED INDEX [IX_Part_ProductId] ON [dbo].[Part]
(
[ProductId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Part] ADD CONSTRAINT [PK_Part] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
最後,這裏有兩個代碼第一實體:
[Table("Product")]
public partial class Product
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Product()
{
Parts = new HashSet<Part>();
}
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Required]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Part> Parts { get; set; }
}
[Table("Part")]
public class Part
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Required]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual Product Product { get; set; }
}
如果你需要更多的代碼或信息,讓我知道你能看到我在做什麼錯什麼會取回數據的快速時尚
當我「刪除ToList」時,你能告訴我代碼的樣子嗎? – crackedcornjimmy
完成,只是刪除ToList()。 – Gusman
這給了我錯誤:不能隱式地將類型'System.Collections.Generic.IEnumerable'轉換爲'System.Collections.Generic.List '。存在明確的轉換(你是否缺少演員?) –
crackedcornjimmy