2

好吧,这种行为让我很困惑。我有一个 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'~'}

注意到最后 LIKE 部分的不同了吗?我真的很困惑。任何帮助将不胜感激。希望这真的很愚蠢。如果它有任何相关性,这是用于过滤来自实体框架源的数据。

谢谢,杰森

4

3 回答 3

1

如果你观察实际的查询,你会看到@p__linq__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 语句中的任何变化值都作为参数传递,而不是直接插入到查询中。

参考:LIKE (Transact-SQL)

于 2013-01-09T00:32:15.150 回答
1

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

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

于 2013-01-09T00:40:21.273 回答
1

在第二种情况下,LINQ 生成一个参数化查询。考虑一下,如果您使用 some 手动构造参数化查询DbCommand

OleDbCommand cmd = new OleDbCommand(
     "SELECT * from SomeTable where SomeField like @Param1", con);
cmd.Parameters.Add("@Param1", OleDbType.VarChar).Value = "%SomeField value%";

@p__linq__0linq 生成的参数的名称也是如此(而在我的示例中是@Param1)。

ESCAPE关键字是LIKE表达式的一部分(参见LIKE (Transact-SQL)):

句法

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.
于 2013-01-09T00:40:46.387 回答