Entity framework SqlQuery eseguire query con ripetute parametro

Sto avendo problemi cercando di eseguire una query SQL con ripetuti parametri utilizzando entity framework.

La query è una parola chiave di ricerca, che si presenta in diverse tabelle, quindi usando lo stesso parametro molte volte. Sto usando COME dichiarazioni (sì, so che si dovrebbe essere utilizzando FULLTEXTSEARCH, ma non ho tempo per ora).

Ho provato tutte le sintassi spiegato qui: Come utilizzare DbContext.Database.SqlQuery<TElement>(sql, params) con stored procedure? EF Codice Prima CTP5 e nessuno di loro fare il lavoro di query (ho zero righe restituite).

Ho anche provato con la costruzione di una matrice di stringhe in fase di runtime, con lunghezza pari al numero di volte in cui il parametro ripete nella query, e quindi la compilazione di tutti gli elementi dell’array con la parola chiave per la ricerca. Quindi ho passato che, come il object[] parametri. Non ha funzionato neanche.

L’unica cosa che funziona è quello di fare una ricerca&sostituire, che è ovviamente una pessima idea, perché il parametro viene da un testo di input, e cercherò di essere vulnerabili ad attacchi di tipo SQL injection.

Il codice di lavoro (vulnerabile ad attacchi di tipo SQL injection, ma la query restituisce righe):

//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;

Sto usando ASP.NET MVC 4, .NET 4.5, SQL Server 2008 e Entity Framework 5.

Qualche idea su come fare il SQLQuery<> metodo popolare di tutte le occorrenze del parametro nella stringa di query? La ringrazio molto per il vostro tempo.

 

3 Replies
  1. 5

    Provare questo:

    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();
  2. 0

    È possibile utilizzare i parametri nella query. Qualcosa di simile a questo

    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();
    • Ho provato questo. Si lancia una SqlException: Deve dichiarare la variabile scalare “@searchTerm”. Grazie per il suggerimento.
  3. -2

    su come provare questo

    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)
    • Ho provato anche questo. Infatti, penso che sia stato uno dei miei primi tentativi. Non lancia un’eccezione, ma la query restituisce zero risultati. Grazie.
    • Hai provato ad utilizzare la query in SQL Management Studio?
    • qual è la tua keywordSearchTerms? è una singola parola? o più parole?
    • La query funziona. Quando uso il search&sostituire la stringa di query, il metodo restituisce i risultati di alcune ricerche che ho preparato per il test. Funziona anche con SQL Management studio. Quindi non è la query che è sbagliato. Quello che penso, il problema è che il SqlQuery<T>(query, params) metodo non sostituisce il segnaposto di parametro nella stringa di query con puro valore. Infine non credo che sia rilevante il valore della keywordSearchTerms. L’operatore COME funziona con le stringhe, a prescindere dal singolo o più parole, a quanto ne so. Grazie per il vostro tempo.
    • Dal momento che si utilizza la stringa.Formato per effettuare la sostituzione del parametro invece di SqlParameter, non è questo il metodo suscettibile di SQL injection?

Lascia un commento