Ich möchte drei Werte übergeben und das Ergebnis entsprechend Dapper erhalten, aber andere Attribute in dieser Klasse nehmen automatisch Nullwerte an und ich möchte diese Parameter vernachlässigen. Jetzt passiere ich einfach param1 und versuche Ergebnis zu bekommen. Allerdings mein Objekt als Param2 und Param3
connection.Query<T>("Query statement", whereConditions)
Die whereConditions ist Objekt mit param1, param2 und param3. Das Ergebnis verwendet jedoch where-Klausel von param, die Werte enthält und die Nullen ignoriert
[AKTUALISIEREN]
Abfrage
select ID, UserName, Screen, Url, LogAction from LogTable
Where UserName = 'Joe' and Screen = 'edit' and LogAction = 'delete'
Von der Benutzeroberfläche aus bin ich mir nicht sicher, ob ich den Benutzernamen oder den Bildschirm oder die Aktion erhalten werde. Ich kann jeden von ihnen bekommen. Meine Anfrage muss sich entsprechend ändern
Wenn ich ein anonymes Objekt erstelle
var whereConditions = new { UserName = "Joe", Screen = "edit" }
Es funktioniert gut, aber im Falle eines anderen Parameters muss ich es als übergeben
var whereConditions = new { UserName = "Joe", Screen = "edit", LogAction = "save" }
Also muss ich verstehen, wie das anonyme Objekt als Bedingung übergeben werden kann.
Ich hoffe das hilft
Ein einfacher Ansatz (der nur funktionieren würde, wenn leere Kriterienwerte immer ignoriert werden können, was üblicherweise der Fall ist, wenn diese Werte von einem UI-Formular stammen), würde immer alle drei Argumente übergeben, um eine WHERE-Klausel zu erstellen, die leere Werte überspringt. z.B.
select ID, UserName, Screen, Url, LogAction
from LogTable
Where (@UserName = '' or UserName = @UserName)
and (@Screen = '' or Screen = @Screen)
and (@LogAction = '' or LogAction = @LogAction)
dann würden Sie alle drei Werte übergeben, unabhängig davon, ob sie leer waren oder nicht
return conn.Query<Result>(
@"
select ID, UserName, Screen, Url, LogAction
from LogTable
Where (@UserName = '' or UserName = @UserName)
and (@Screen = '' or Screen = @Screen)
and (@LogAction = '' or LogAction = @LogAction)
",
new
{
UserName = userName?? "",
Screen = screen ?? "",
LogAction = logAction ?? ""
}
);
Wenn Sie dies innerhalb einer Methode mit optionalen Argumenten wie dieser abgeschlossen haben:
private IEnumerable<Result> GetData(
string userName = null,
string screen = null,
string logAction = null)
{
using (var conn = GetConnection())
{
return conn.Query<Result>(
@"
select ID, UserName, Screen, Url, LogAction
from LogTable
Where (@UserName = '' or UserName = @UserName)
and (@Screen = '' or Screen = @Screen)
and (@LogAction = '' or LogAction = @LogAction)
",
new
{
UserName = userName ?? "",
Screen = screen ?? "",
LogAction = logAction ?? ""
}
);
}
}
Dann könnten Sie den aufrufenden Code für unterschiedliche Anzahlen von Argumenten ganz natürlich aussehen lassen - z.
var joeData = GetData(userName: "Joe");
var joeEditData = GetData(userName: "Joe", screen: "save");
Wenn Sie jedoch immer die drei Werte (userName, screen und logAction) anfordern und nur die Null- / Leerwerte ignoriert werden sollen, können Sie natürlich einfach anrufen
var data = GetData(request.UserName, request.Screen, request.LogAction);