C# 创建实体框架对象会导致长时间运行的查询

C# 创建实体框架对象会导致长时间运行的查询,c#,sql,entity-framework,C#,Sql,Entity Framework,我有一个数据库模式,其中包括表Orders、Options[Id,OptionGroupId,…]、OrderOptions[Id,OptionId]和关联表OrderSheetOptions[OrderSheetId,OrderOptionId] 我的C#代码正在创建OrderOption EF对象(映射到数据库表的对象): 出现这个问题的原因似乎是我在创建OrderOption时设置了它的Option属性。这将导致EF运行此查询: exec sp_executesql N'SELECT

我有一个数据库模式,其中包括表Orders、Options[Id,OptionGroupId,…]、OrderOptions[Id,OptionId]和关联表OrderSheetOptions[OrderSheetId,OrderOptionId]

我的C#代码正在创建OrderOption EF对象(映射到数据库表的对象):

出现这个问题的原因似乎是我在创建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,因此您可以从上面的查询中看到,每个记录都会返回。随着这个表的增长,这个查询变得非常慢,并且严重影响了网站用户体验(UX)延迟数分钟

我通常只添加3条记录,因为这是默认选项。我已经向OrderOptions添加了一个索引,但它没有帮助,因为该表中的每个记录都有OptionId=1,因此自动EF查询将返回所有记录

看起来EF正在查询整个OrderOptions表,以确保没有创建重复的对象,但OrderOption是特定于订单的,因此它只需要担心当前订单。然而,期权并不直接与订单挂钩;仅通过OrderSheetOptions间接提供。因此,EF查询不能将自身限制为当前顺序。有人能告诉我如何优化它,使EF不必为了添加新项而查询整个OrderOptions表吗


谢谢

我对你的第一行代码有点困惑。使用
Sheet.OptionGroups.Select(og=>og.Option)您试图实现什么?我认为您的第一行应该是
var options=options.ToList()
var options=options.Where(…).ToList()米勒鲁瓦:我希望这个数据库还有很多不相关的地方,所以细节已经被删除了。选项被分组并分配给构成订单的包的一部分的图纸。因此,此行检索正在订购的包的默认选项。关键是我有一个选项列表,我正在添加到当前的OrderOptions中。如果可以,您可能希望发布Option和OrderOption的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