簡體   English   中英

SQL“IN”條款性能問題

[英]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索引,這可能不會發生在SUBSTRINGREPLACE

我認為你正在比較一個字符數組而不是字符串。 試試這個

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM