Wie erstellt Abfrage mit mehreren LIKE-s, die nicht Speicherproblem im Dapper-Cache erstellt?

.net asp.net-mvc c# dapper sql

Frage

Ich verwende Dapper, um mit der SQL-Datenbank zu arbeiten. Ich habe eine Suchlogik in meinem Website-Projekt.

Meine Suche ruft eine Liste von String-Parametern auf.

//filter is list of strings

var sql = new StringBuilder();
sql.Append("SELECT LibraryDocumentId FROM LibraryDocumentKeywords WHERE ");

sql.Append(string.Join("OR ", filter.Select(f => string.Format("LOWER(Keyword) LIKE '%{0}%'", f)).ToList()));

var isList = conn.Query<int>(sql.ToString()).ToList();

Eigentlich möchte ich diesen Ansatz der Generierung dynamischer SQL-Abfragen nicht verwenden, da Dapper jede einzelne Abfrage zwischenspeichert. Ich würde es vorziehen, Filter mit Parameter zu übergeben. Kann mir jemand dabei helfen? Irgendeine Idee ?

Akzeptierte Antwort

Was Sie im Moment haben, ist auch ein großes SQL-Injection-Risiko. Vielleicht möchten Sie DynamicParameters hier verwenden, dh (vollständig ungetestet, müssen Sie vielleicht etwas DynamicParameters ):

var sql = new StringBuilder(
    "SELECT LibraryDocumentId FROM LibraryDocumentKeywords");
int i = 0;
var args = new DynamicParameters();
foreach(var f in filter) {
    sql.Append(i == 0 ? " WHERE " : " OR ")
        .Append("LOWER(Keyword) LIKE @p").Append(i);
    args.Add("p" + i, "%" + f + "%");
    i++;
}
var data = conn.Query<int>(sql.ToString(), args);

Dies sollte ziemlich sauber zwischengespeichert werden (ein Cache-Element pro Anzahl von Filtern, unabhängig von deren Inhalt).



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum