我使用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时避免重新编译?
我正在以模型第一种方法开发模型第一个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