不必要的转换为bigint

时间:2017-02-08 06:51:15

标签: c# sql-server entity-framework expression

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

public partial class Employee
{
     public long Emp_No { get; set; }
     public string Name { get; set; }
     public string Family { get; set; }
     ...
}

我用Entity Framework

编写这个基本查询
List<long> ids = new List<long>() {1,2,3,4,5,6}
database.Employees.Where(q => ids.Contain(q.Emp_No)).ToList();

按以下方式生成查询:

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))

正如您所看到的那样,Emp_Noids数组的类型都是long时,查询中存在不必要的强制转换,只有ids时才会导致执行时间错误数组有很多元素。

如何删除此多余演员?

2 个答案:

答案 0 :(得分:4)

转换cast(0 as bigint)几乎没有任何费用,因为Emp_No也是bigint如果你没有强制转换,那么int仍然需要升级为bigint为了能够进行IN比较,所以演员阵容仍然会发生,就在幕后。

在管理工作室中自己运行查询的非强制版本并获取实际执行计划,您仍会在查询计划中看到转换。

答案 1 :(得分:-2)

不确定你在这里要求的是什么但是......

将long更改为int,查询应该使您成为int而不是bigint。

public partial class Employee
 {
     public int Emp_No { get; set; }
     public string Name { get; set; }
     public string Family { get; set; }
     ....
 }

Long相当于bigint。 您可以在此处阅读更多内容:What is the equivalent of bigint in C#?