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_No和ids阵列long,它会导致糟糕的执行时间,特别是每当ids数组有很多元素.
如何删除这个多余的演员阵容?
转换实际上没有任何成本cast(0 as bigint),因为Emp_No如果bigint您没有那里的强制转换,那么 int 仍然需要升级为 bigint 才能进行比较,IN因此强制转换仍然会发生,就在幕后。
在 Management Studio 中自行运行查询的非转换版本并获取实际的执行计划,您仍然会在查询计划中看到转换。
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |