我有一个数据库架构,其中包括表Orders,Options [Id,OptionGroupId,...],OrderOptions [Id,OptionId]和一个关联表OrderSheetOptions [OrderSheetId,OrderOptionId]。
我的C#代码正在创建OrderOption EF对象(映射到数据库表的对象):
// Select all default options
var options = Sheet.OptionGroups.Select(og => og.Option);
foreach (var option in options)
{
// Add all default options
OrderOptions
.Add(new OrderOption
{
Option = option
});
}
问题似乎出现了,因为我在创建OrderOption时设置了Option属性。这导致EF运行此查询:
exec sp_executesql N'SELECT
[Extent1].[Id] AS [Id],
[Extent1].[OptionId] AS [OptionId]
FROM [dbo].[OrderOptions] AS [Extent1]
WHERE [Extent1].[OptionId] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
每个订单都有一个OptionId = 1的默认OrderOption,因此从上面的查询中可以看出,每个记录都会被返回。随着这个表的增长,这个查询变得非常缓慢并且严重影响了网站用户体验 - 延迟了几分钟。
我通常只添加3条记录,因为这些是默认选项。我已经为OrderOptions添加了一个索引,但它没有帮助,因为该表中的每个记录都有一个OptionId = 1,因此自动EF查询返回所有记录。
看起来EF正在查询整个OrderOptions表以确保没有创建重复的对象,但OrderOption是特定于Order的,因此它只需要担心当前的订单。但是,期权与订单没有直接联系;仅通过OrderSheetOptions间接进行。因此,EF查询不能将自己限制为当前订单。任何人都可以告诉我如何优化这一点,以便EF不必查询整个OrderOptions表只是为了添加新项目吗?
谢谢!