不必要的转换为bigint

Vah*_*ari 11 c# sql-server expression entity-framework

我有员工表与bigint数据库中的主键字段和实体数据模型与数据库第一种方法.Employee类具有此结构

public partial class Employee
{
     public long Emp_No { get; set; }
     public string Name { get; set; }
     public string Family { get; set; }
     ...
}
Run Code Online (Sandbox Code Playgroud)

我用Entity Framework编写这个基本查询

List<long> ids = new List<long>() {1,2,3,4,5,6}
database.Employees.Where(q => ids.Contain(q.Emp_No)).ToList();
Run Code Online (Sandbox Code Playgroud)

它生成如下查询:

SELECT 
    [Extent1].[Emp_No] AS [Emp_No], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Family] AS [Family], 
    ...
    FROM [dbo].[Employee] AS [Extent1]
    WHERE [Extent1].[Emp_No] IN (cast(0 as bigint), 
                                 cast(1 as bigint), 
                                 cast(2 as bigint), 
                                 cast(3 as bigint), 
                                 cast(4 as bigint), 
                                 cast(5 as bigint), 
                                 cast(6 as bigint))
Run Code Online (Sandbox Code Playgroud)

正如你可以看到有没有必要投中查询到BIGINT同时兼备型Emp_Noids阵列long,它会导致糟糕的执行时间,特别是每当ids数组有很多元素.

如何删除这个多余的演员阵容?

Sco*_*ain 6

转换实际上没有任何成本cast(0 as bigint),因为Emp_No如果bigint您没有那里的强制转换,那么 int 仍然需要升级为 bigint 才能进行比较,IN因此强制转换仍然会发生,就在幕后。

在 Management Studio 中自行运行查询的非转换版本并获取实际的执行计划,您仍然会在查询计划中看到转换。