2

さて、この振る舞いは私を本当に困惑させました。文字列フィールドに部分文字列が含まれているかどうかを確認するために Where 句を追加しようとしている IQueryable リストがあります。次のように検索文字列をハードコーディングすると:

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 部分の違いに気付きましたか? 私は本当に混乱しています。どんな助けでも大歓迎です。これが本当にばかげたことであることを願っています。関連性がある場合、これは Entity Framework ソースからのデータをフィルター処理するためのものです。

ありがとう、ジェイソン

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

LIKE2 番目の内部クエリは、予想どおり、句でパラメーターを使用しているだけです。

異なる結果が観察されている場合は、あるケースで合格し、別の"SO"ケースで合格していることが原因である可能性があります"S0"(少なくとも質問のコードの一部では)。

于 2013-01-09T00:40:21.273 に答える
1

2 番目のケースでは、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 に答える