C# 添加包含字符串Contains测试的Linq Where子句时出现问题
好吧,这种行为让我很困惑。我有一个IQueryable列表,我正试图添加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
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。为了清晰起见,我在我的帖子中修正了它。谢谢