2013-04-30 81 views
3

我遇到了麻煩,嘗試使用實體框架重複執行帶有參數的SQL查詢。實體框架SqlQuery使用重複參數執行查詢

該查詢是關鍵字搜索,它在不同的表中查找,因此多次使用相同的參數。我使用LIKE語句(是的,我知道我應該使用FULLTEXTSEARCH,但現在我沒有時間)。

我試過所有在這裏解釋的語法:How to use DbContext.Database.SqlQuery<TElement>(sql, params) with stored procedure? EF Code First CTP5並且它們都不使查詢工作(我得到零返回的行)

我甚至嘗試在運行時建立一個字符串數組,其長度等於參數在查詢中重複的次數,然後用關鍵字搜索詞填充數組的所有元素。然後我通過那個對象[]參數。也沒有工作。

唯一可行的是做一個搜索&取代,這顯然是一個壞主意,因爲參數來自一個文本輸入,我會很容易受到SQL注入攻擊。

工作代碼(容易受到SQL注入式攻擊,但查詢返回行):

//not the real query, but just for you to have an idea 
string query = 
    "SELECT Field1, " + 
    "  Field2 " + 
    "FROM Table1 " + 
    "WHERE UPPER(Field1) LIKE '%{0}%' " + 
    "OR  UPPER(Field2) LIKE '%{0}%'"; 

//keywordSearchTerms is NOT sanitized 
query = query.Replace("{0}", keywordSearchTerms.ToUpper()); 

List<ProjectViewModel> list = null; 
using (var context = new MyContext()) 
{ 
    list = context.Database.SqlQuery<ProjectViewModel>(query, new object[] { }).ToList(); 
} 
return list; 

我使用ASP.NET MVC 4,.NET 4.5,SQL Server 2008和實體框架5。

關於如何使SQLQuery <>方法填充查詢字符串中參數的所有出現的任何想法?非常感謝您的寶貴時間。

回答

-1

怎麼樣試試這個

string query = 
string.Format("SELECT Field1, Field2 FROM Table1 WHERE UPPER(Field1) LIKE '%{0}%' 
OR  UPPER(Field2) LIKE '%{0}%'",keywordSearchTerms.ToUpper()); 

context. Database.SqlQuery<ProjectViewModel>(query) 
+0

我也嘗試過這一點。事實上,我認爲這是我的第一次嘗試之一。它不會拋出異常,但查詢返回零結果。謝謝。 – 2013-04-30 13:54:05

+0

您是否嘗試在SQL Management Studio中使用查詢? – 2013-04-30 13:56:27

+0

什麼是您的keywordSearchTerms? 這是一個單詞嗎?或多個詞? – 2013-04-30 14:36:57

0

您可以在查詢中使用的參數。這樣

string query = 
"SELECT Field1, " + 
"  Field2 " + 
"FROM Table1 " + 
"WHERE UPPER(Field1) LIKE @searchTerm" + 
"OR  UPPER(Field2) LIKE @searchTerm"; 

     string search= string.Format("%{0}%", keywordSearchTerms); 

     context.SqlQuery<ProjectViewModel>(query, new SqlParameter("@searchTerm", search)).ToList(); 
+0

我試過了。它拋出一個SqlException:必須聲明標量變量「@searchTerm」。感謝您的建議。 – 2013-04-30 13:52:05

5

東西試試這個:

string query = 
@"SELECT Field1, 
      Field2 
    FROM Table1 
    WHERE UPPER(Field1) LIKE '%' + @searchTerm + '%' 
     OR UPPER(Field2) LIKE '%' + @searchTerm + '%'"; 


    context.SqlQuery<ProjectViewModel>(query, new SqlParameter("@searchTerm", searchTerm)).ToList();