[英]SQL “IN” CLAUSE Performance issue
我有一個簡單的SQL語句:
select * from Employee
where LEFT(REPLACE(EmployeeName,'.',''),4) IN ('ABCE', 'BCDS', 'EDSC', 'XDSD', 'EFSE')
而我正試圖在Linq做到這一點:
Employees.Where(x => new[] { "ABCE", "BCDS", "EDSC", "XDSD", "EFSE" }.Contains((x.EmployeeName.Replace(".", "").Substring(0, 4))));
但它生成的SQL語句效率不高。 每次更新EmployeeName,然后再與字符串進行比較,而不只是一次:
SELECT
[Extent1].[EmployeeID] AS [EmployeeID],
[Extent1].[EmployeeName] AS [EmployeeName],
[Extent1].[EmployeeTypeID] AS [EmployeeTypeID],
[Extent1].[Active] AS [Active]
FROM [dbo].[Employee] AS [Extent1]
WHERE (N'ABCE' = (SUBSTRING(REPLACE([Extent1].[EmployeeName], N'.', N''), 0 + 1, 4)))
OR (N'BCDS' = (SUBSTRING(REPLACE([Extent1].[EmployeeName], N'.', N''), 0 + 1, 4)))
OR (N'EDsC' = (SUBSTRING(REPLACE([Extent1].[EmployeeName], N'.', N''), 0 + 1, 4)))
OR (N'XDSs' = (SUBSTRING(REPLACE([Extent1].[EmployeeName], N'.', N''), 0 + 1, 4)))
OR (N'EFSE' = (SUBSTRING(REPLACE([Extent1].[EmployeeName], N'.', N''), 0 + 1, 4)))
如何使生成的SQL看起來更像原始的sql語句? 謝謝
我只用linqpad測試它,但我認為這將產生更有效的查詢。
var result = from record in Employee
let name = record.EmployeeName.Replace( ".", "" ).Substring( 0, 4 )
where new[] { "ABCE", "BCDS", [...] }.Contains( name )
select record;
這很奇怪,但我重寫了你的查詢並生成了sql語句
WHERE (SUBSTRING(REPLACE([Extent1].[EmployeeName], N'.', N''), 0 + 1, 4) IN (N'ABCE', N'BCDS', N'EDSC', N'XDSD', N'EFSE')) AND (SUBSTRING(REPLACE([Extent1].[Name], N'.', N'')
我想這取決於使用過的數據庫和框架(在我的例子中是SQL Server 2008和EF)。
如果您使用EF,則可以強制EF使用您的sql語句
context.Set<Employee>().SqlQuery("select * from Employee where LEFT(REPLACE(EmployeeName,'.',''),4) IN ('ABCE', 'BCDS', 'EDSC', 'XDSD', 'EFSE')");
我認為你不能(輕松地,至少)控制sql語句生成過程的這些細節。
但是,如果您正在尋找最好的可能性查詢,我會嘗試使用LIKE
運算符(通過在LINQ查詢中使用一系列.StartsWith
條件)。
LIKE
可以使用sql索引,這可能不會發生在SUBSTRING
和REPLACE
。
我認為你正在比較一個字符數組而不是字符串。 試試這個
Employees.Where(x => new string[] { "ABCE", "BCDS", "EDSC", "XDSD", "EFSE" }
.Contains((x.EmployeeName.Replace(".", "").Substring(0, 4).ToString())));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.