2016-09-21 88 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

我昨天在答案中發現了這個博客,並在我注意到你改變了你的答案之前發佈了我的答案,正是我發現的。我想接受我的回答,因爲博客中有一個解決方案幫助我解決問題,但是會提高您的答案以表示對您的幫助表示讚賞。 –