小编t3z*_*t3z的帖子

在Entity Framework LINQ查询中使用IEnumerable.Contains时如何避免查询计划重新编译?

我使用Entity Framework(v6.1.1)执行以下LINQ查询:

private IList<Customer> GetFullCustomers(IEnumerable<int> customersIds)
{
    IQueryable<Customer> fullCustomerQuery = GetFullQuery();
    return fullCustomerQuery.Where(c => customersIds.Contains(c.Id)).ToList();
}
Run Code Online (Sandbox Code Playgroud)

这个查询被翻译成相当不错的SQL:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[FirstName] AS [FirstName]
-- ...
FROM [dbo].[Customer] AS [Extent1]
WHERE [Extent1].[Id] IN (1, 2, 3, 5)
Run Code Online (Sandbox Code Playgroud)

但是,我在查询编译阶段获得了非常显着的性能影响.呼叫:

ELinqQueryState.GetExecutionPlan(MergeOption? forMergeOption) 
Run Code Online (Sandbox Code Playgroud)

占用每个请求约50%的时间.深入研究,结果是每次我传递不同的customersIds时都会重新编译查询.根据MSDN文章,这是一个正常现象,因为IEnumerable的是在查询中使用被认为是挥发性的,并且是缓存的SQL的一部分.这就是为什么SQL对于customersIds的每个不同组合都是不同的,并且它总是具有用于从缓存中获取编译查询的不同哈希.

现在问题是:如何在仍然查询多个customersIds时避免重新编译?

linq performance linq-to-entities entity-framework

31
推荐指数
2
解决办法
3298
查看次数

在模型设计器中使用强空间类型选项锁定?

我正在以模型第一种方法开发模型第一个EF6模型.

EF暴露的不仅仅是DBGeometry和DBGeography,还允许我在设计模型时选择特定的子类型(如GeographyPoint).

但是,即使我选择了更具体的子类型,我生成的类仍然只是DBGeography.

我注意到模型上的一个名为"使用强空间类型"的属性,但默认设置为false并且似乎已锁定(灰色,没有下拉列表,无法键入).这似乎意味着支持生成更强大的类型化的类(例如,在生成的类中将使用GeographyPoint而不是DBGeography)

知道是什么原因引起的吗?这听起来像一个有用的功能.

我的目标是SQL Server Express 2012,如果这是一个问题,我可以切换到另一个版本,因为我没有做任何特定的版本.

更新:如果你不确定你理解我所指的是什么,请参见图片链接!

https://www.dropbox.com/s/lzgsoi60whuicy0/EF%20Spacial%20Strong.png?dl=0

在此输入图像描述

sql-server entity-framework .net-4.5 ef-model-first entity-framework-6

7
推荐指数
1
解决办法
863
查看次数