2017-06-28 9 views
1

Was ich versuche es ein Filterobjekt zu tun hat, die wie soDapper.net mit unbekannter Menge von Arrayelementen

var filter = new Filter 
{ 
    ThingID = 1, 
    Keywords = new[] { "op", "s" } 
}; 

Und dann in der Lage sein, den Aufbau die Abfrage wie folgt aufgefüllt wird:

Das funktioniert gut, wenn nur die ThingID-Stütze besetzt ist, aber soweit ich das beurteilen kann, wird Dapper die Schlüsselwörter nicht als Parameter in irgendeiner Weise einspeisen. Ist das mit Dapper möglich, oder funktioniert das nur im Kontext von "Wo Keywords in @Keywords"?

Antwort

2

Parameter müssen nach Namen übereinstimmen; Sie fügen Parameter wie @Keywords17 hinzu, aber es gibt keine Keywords17 Eigenschaft für das Hinzufügen. Es interpretiert das nicht als Keywords[17], wenn das was du meinst. Dort ist einige automatische Erweiterung von flachen Arrays, aber das ist für die Erweiterung in @Keywords (obwohl die Erweiterung selbst ist nicht spezifisch für in). Es gibt momentan nichts, was dir da automatisch helfen würde; Ich würde DynamicPaameters stattdessen vorschlagen:

var args = new DynamicParameters(); 
args.Add("ThingID", 1); 
... 
if (!string.IsNullOrWhiteSpace(keyword)) 
{ 
    sb.AppendLine(" and (Model like '%' || @Keywords" + i + " || '%')"); 
    args.Add("Keywords" + i, keyword); 
} 
... 
var cmd = new CommandDefinition(sql, args, flags: CommandFlags.NoCache); 
var results = Query<Stuff>(cmd).AsList(); 

Note die subtilen zwei Änderungen am Ende hier - CommandFlags.NoCache wird dazu beitragen, Gebäude viele Lookup-Einträge für ähnlichen, aber unterschiedlichen SQL vermeiden (obwohl Sie dies bezahlen können wählen, pro-Artikel zu reduzieren Kosten, bis zu dir). Die AsList anstelle von ToList vermeidet eine zusätzliche Listenzuordnung.

Verwandte Themen