2016-09-21 86 views
1

我试图按照示例here所示的拦截示例使其与EF 6一起工作,但遇到如图1所示的函数RewriteFullTextQuery的问题。拦截似乎正常但它并不实际执行RewriteFullTextQuery方法的for循环中的逻辑,因为cmd.Parameters.Count始终为零。此外,cmd.CommandText属性似乎正在显示正确的SQL查询,我将其作为拦截工作正常的另一项证据。拦截不按预期与实体框架一起工作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大于零?

回答

1

事实证明,这是因为实体框架生成SQL的方式。如果将字符串字面值作为搜索值传递给LINQ语句,则不会生成使用参数的SQL。但是,如果您将搜索值作为变量传递,它将生成使用参数的SQL。一个解决方案(用于动态查询)和更多细节可以在这个blog找到。

1

仅当您将参数作为变量传递给查询时,它才有效。如果你使用一个文字EF不会使用参数。
我的意思是,这不会产生任何参数

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

这将

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

我昨天在答案中发现了这个博客,并在我注意到你改变了你的答案之前发布了我的答案,正是我发现的。我想接受我的回答,因为博客中有一个解决方案帮助我解决问题,但是会提高您的答案以表示对您的帮助表示赞赏。 –