Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL";在;条款履约问题_C#_Sql_Linq_Linq To Entities - Fatal编程技术网

C# SQL";在;条款履约问题

C# SQL";在;条款履约问题,c#,sql,linq,linq-to-entities,C#,Sql,Linq,Linq To Entities,我有一个简单的SQL语句: select * from Employee where LEFT(REPLACE(EmployeeName,'.',''),4) IN ('ABCE', 'BCDS', 'EDSC', 'XDSD', 'EFSE') 我正试图在林克做到这一点: Employees.Where(x => new[] { "ABCE", "BCDS", "EDSC", "XDSD", "EFSE" }.Contains((x.EmployeeName.Replace(".",

我有一个简单的SQL语句:

select * from Employee 
where LEFT(REPLACE(EmployeeName,'.',''),4) IN ('ABCE', 'BCDS', 'EDSC', 'XDSD', 'EFSE')
我正试图在林克做到这一点:

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语句?谢谢

我想您是在比较字符数组而不是字符串。试试这个

Employees.Where(x => new string[] { "ABCE", "BCDS", "EDSC", "XDSD", "EFSE" }
         .Contains((x.EmployeeName.Replace(".", "").Substring(0, 4).ToString())));

我只使用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'')
我想这取决于所使用的数据库和框架(在我的例子中是SQLServer2008和EF)

如果您使用的是EF,则可以强制EF使用sql语句

context.Set<Employee>().SqlQuery("select * from Employee where LEFT(REPLACE(EmployeeName,'.',''),4) IN ('ABCE', 'BCDS', 'EDSC', 'XDSD', 'EFSE')");
context.Set();
我认为您无法(至少很容易)控制sql语句生成过程中的这些细节

但是,如果您正在寻找最好的查询,我将尝试使用
LIKE
操作符(在LINQ查询中使用一系列
.StartsWith
条件)


LIKE
可以使用sql索引,这可能不会发生在
子字符串
替换

“如何使生成的sql看起来更像原始sql语句?”-我怀疑它们是一样的!IN子句本质上是复合句或复合句。我建议你确切地告诉我们你想要实现什么,而不是一个感知的解决方案。我尝试了原始语句和生成的语句。生成的语句运行速度慢了很多。这很奇怪,但我重写了您的查询,并且生成的sql语句是“WHERE(SUBSTRING(REPLACE([Extent1].[Name],N'.',N''),(N'ABCE',N'BCDS',N'EDSC',N'XDSD',N'EFSE'))和(SUBSTRING(REPLACE([Extent1].[Name],N'.',N''),0+1,4)不是空的)”。你确定这就是整个查询吗?您使用的是哪种EF版本?您使用的是SQL Server还是其他提供程序?@downvoter也许您可以解释为什么您对这个答案投反对票?