2016-09-21 6 views
1

図1に示すように、hereという傍受例に従うと、EF 6で動作するようになりましたが、RewriteFullTextQueryの問題が発生しています。 cmd.Parameters.Countは常にゼロであるため、RewriteFullTextQueryメソッドのforループ内のロジックは実際には実行されません。さらに、cmd.CommandTextプロパティは、傍受が正しく機能しているという別の証拠として、正しいSQLクエリを表示しているようです。インターセプトがEntity Framework 6で期待どおりに動作しない

図1:RewriteFullTextQueryコード抜粋

public static void RewriteFullTextQuery(DbCommand cmd) 
    { 
     string text = cmd.CommandText; 
     for (int i = 0; i < cmd.Parameters.Count; i++) 
     { 
      DbParameter parameter = cmd.Parameters[i]; 
      if (parameter.DbType.In(DbType.String, DbType.AnsiString, DbType.StringFixedLength, DbType.AnsiStringFixedLength)) 
      { 

RewriteFullTextQuery機能はそれをすべての問題を引き起こしているコマンド引数を与え、図2に示すReaderExecuting関数によって呼び出されています。

図2:ReaderExecuting機能は

私のコードを例とまったく同じではありませんが
public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) 
    { 
     RewriteFullTextQuery(command); 
    } 

、傍受が移入されます、それがある、それは私がどのような条件を不思議作っているので、動作しているようですコマンドのParameters.Countが0より大きい場合

答えて

1

それはそれがためにEntity Frameworkのは、SQLを生成する方法のためであることが判明します。検索値として文字列リテラルをLINQ文に渡すと、パラメータを使用するSQLは生成されません。しかし、検索値を変数として渡すと、パラメータを使用するSQLが生成されます。この解決策(動的クエリ用)と詳細はblogにあります。

1

パラメータがクエリに変数として渡された場合にのみ機能します。リテラルを使用する場合、EFはパラメータを使用しません。私が意味する
が、これは任意のパラメータ

context.Notes.Where(_ => _.NoteText == "CompareValue").Count(); 

に生成されません。この

string compareValue = "CompareValue"; 
context.Notes.Where(_ => _.NoteText == compareValue).Count(); 
+1

私は昨日の答えでブログを見つけ、私があなたが答えを見つけた直前に私の答えを投稿しました。ブログには私を助けてくれた解決策があったので、あなたの助けに感謝の気持ちを示すために答えをアップアップするので、私は私の答えを受け入れたいと思います。 –

関連する問題