【问题标题】:Unnecessary conversion to bigint不必要的转换为 bigint
【发布时间】:2017-06-25 16:21:10
【问题描述】:

我在数据库中有带有bigint 主键字段的员工表和采用数据库优先方法的实体数据模型。 Employee类有这个结构

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

我用实体框架编写这个基本查询

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

正如您所见,查询中没有必要强制转换为 bigint,而 Emp_Noids 数组的类型都是 long,这会导致执行时间很差,特别是当 ids 数组有很多元素时。

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

【问题讨论】:

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


    【解决方案1】:

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

    将您的 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#?

    【讨论】:

    • 我不能这样做..我需要长类型
    【解决方案2】:

    转换cast(0 as bigint) 几乎没有任何成本,因为Emp_No 也是bigint,如果你在那里没有演员表,int 仍然需要提升为 bigint 才能执行IN 比较,所以演员仍然会发生,就在幕后。

    在 management studio 中自己运行查询的 non cast 版本并获得实际的执行计划,您仍然会在查询计划中看到转换。

    【讨论】:

      猜你喜欢
      • 2011-12-20
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2020-01-19
      • 2021-06-23
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多