Ich habe einen Lambda-Ausdruck, den ich gerne weitergeben und wiederverwenden möchte. Hier ist der Code:
public List<IJob> getJobs(/* i want to pass the lambda expr in here */) {
using (SqlConnection connection = new SqlConnection(getConnectionString())) {
connection.Open();
return connection.Query<FullTimeJob, Student, FullTimeJob>(sql,
(job, student) => {
job.Student = student;
job.StudentId = student.Id;
return job;
},
splitOn: "user_id",
param: parameters).ToList<IJob>();
}
Der Schlüssel hier ist, dass ich den Lambda-Ausdruck, den ich hier verwende, an die Methode übergeben kann, die diesen Code aufruft, damit ich ihn wiederverwenden kann. Der Lambda-Ausdruck ist das zweite Argument in meiner .Query-Methode. Ich gehe davon aus, dass ich eine Aktion oder eine Funktion verwenden möchte, bin mir aber nicht ganz sicher, wie die Syntax dafür lautet oder wie sie funktioniert. Kann mir bitte jemand ein Beispiel geben?
Antworten:
Verwenden Sie einen
Func<T1, T2, TResult>
Delegaten als Parametertyp und übergeben Sie ihn anQuery
:Sie würden es nennen:
Oder weisen Sie das Lambda einer Variablen zu und übergeben Sie es .
quelle
Wenn ich verstehe, benötigen Sie folgenden Code. (Übergabe des Ausdrucks Lambda als Parameter) Die Methode
Aufrufmethode
Sie können dasselbe in ihrer Klasse tun, siehe Beispiel.
Aufrufmethode
Ich hoffe das ist nützlich
quelle
Compile()
in der.Where
? Ich habe gesehen, dass es auch ohne das funktioniert.Lambda-Ausdrücke haben den Typ
Action<parameters>
(falls sie keinen Wert zurückgeben) oderFunc<parameters,return>
(falls sie einen Rückgabewert haben). In Ihrem Fall haben Sie zwei Eingabeparameter und müssen einen Wert zurückgeben. Daher sollten Sie Folgendes verwenden:quelle
Sie sollten einen Delegatentyp verwenden und diesen als Befehlsparameter angeben. Sie können einen der integrierten Delegattentypen verwenden -
Action
undFunc
.In Ihrem Fall sieht es so aus, als würde Ihr Delegat zwei Parameter verwenden und ein Ergebnis zurückgeben, sodass Sie Folgendes verwenden können
Func
:Sie können dann Ihre
GetJobs
Methode aufrufen , die in einer Delegateninstanz übergeben wird. Dies kann eine Methode sein, die dieser Signatur entspricht, ein anonymer Delegat oder ein Lambda-Ausdruck.PS Sie sollten PascalCase für Methodennamen verwenden -
GetJobs
nichtgetJobs
.quelle