C# 添加包含字符串Contains测试的Linq Where子句时出现问题

C# 添加包含字符串Contains测试的Linq Where子句时出现问题,c#,string,linq,where,C#,String,Linq,Where,好吧,这种行为让我很困惑。我有一个IQueryable列表,我正试图添加Where子句来检查字符串字段是否包含子字符串。当我硬编码搜索字符串时,如下所示: sourceList = sourceList.Where(license => license.FileNumber.Contains("S0")) 它按预期工作,并从Visual Studio调试器中的sourceList生成内部查询: {SELECT [Extent1].[id] AS [id], [Extent1].[File

好吧,这种行为让我很困惑。我有一个IQueryable列表,我正试图添加Where子句来检查字符串字段是否包含子字符串。当我硬编码搜索字符串时,如下所示:

sourceList = sourceList.Where(license => license.FileNumber.Contains("S0"))
它按预期工作,并从Visual Studio调试器中的sourceList生成内部查询:

{SELECT [Extent1].[id] AS [id], [Extent1].[FileNumber] AS [FileNumber],
    [Extent1].[LegalLocation] AS [LegalLocation]FROM [dbo].[Licenses]
    AS [Extent1]WHERE [Extent1].[FileNumber] LIKE N'%S0%'}
当我从一个变量设置搜索值时,奇怪的事情发生了,比如:

string testString = "S0";
sourceList = sourceList.Where(license => license.FileNumber.Contains(testString))
这将生成内部查询:

{SELECT [Extent1].[id] AS [id], [Extent1].[FileNumber] AS [FileNumber],
    [Extent1].[LegalLocation] AS [LegalLocation]FROM [dbo].[Licenses]
    AS [Extent1]WHERE [Extent1].[FileNumber] LIKE @p__linq__0 ESCAPE N'~'}
注意到末尾相似部分的差异了吗?我真的很困惑。任何帮助都将不胜感激。希望这是件很愚蠢的事。如果它有任何相关性,则用于过滤实体框架源中的数据

谢谢,
Jason

如果您观察实际的查询,您将看到
@p\uu linq\uu 0
实际分配了
S0
值,然后传递给查询

@p__linq__0 = '%S0%';
... WHERE [Extent1].[FileNumber] LIKE @p__linq__0 ESCAPE N'~'
基本上是这样的:

... WHERE [Extent1].[FileNumber] LIKE N'%S0%' ESCAPE N'~'
因为它是一个参数,LINQ只是采取了预防措施,添加了
ESCAPE
子句。它也是一个变量,而不是硬编码的常量,LINQ语句中的任何更改值都作为参数传递,而不是直接插入到查询中

@p__linq__0 = '%S0%';
... WHERE [Extent1].[FileNumber] LIKE @p__linq__0 ESCAPE N'~'

参考资料:

第二个内部查询只是使用了
LIKE
子句中的一个参数,正如预期的那样


如果您观察到不同的结果,可能是因为您在一种情况下传递了
“SO”
,而在另一种情况下传递了
“S0”
(至少在您问题中的一些代码中)。

在第二种情况下,LINQ生成一个参数化查询。请考虑,如果您使用一些<代码> dBurd> <代码>:

手动构造参数化查询。
OleDbCommand cmd = new OleDbCommand(
     "SELECT * from SomeTable where SomeField like @Param1", con);
cmd.Parameters.Add("@Param1", OleDbType.VarChar).Value = "%SomeField value%";
因此,
@p\uu linq\uu 0
是由linq生成的参数的名称(而在我的示例中,它是
@Param1

ESCAPE
关键字是
LIKE
表达式的一部分(请参阅):

语法

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
在哪里

转义字符

Is a character that is put in front of a wildcard character to indicate that the    
wildcard should be interpreted as a regular character and not as a wildcard. 
escape_character is a character expression that has no default and must evaluate to 
only one character.

它就像第二种情况中的参数一样简单地传递。第二个查询是否返回错误的结果或显示其他不需要的行为?我认为它没有返回正确的结果,但这实际上是由一个不相关的问题引起的。我接受了Brad的解决方案,因为它是最详细的。谢谢大家!你说得很对,布拉德,这正好显示了我对林的新手身份(问:)接球不错,虽然这不是我困惑的原因,但当我测试时,它实际上都是S0。为了清晰起见,我在我的帖子中修正了它。谢谢