J'ai une expression lambda que j'aimerais pouvoir faire circuler et réutiliser. Voici le 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>();
}
La clé ici, c'est que je veux pouvoir passer l'expression lambda que j'utilise ici dans la méthode qui appelle ce code, afin que je puisse le réutiliser. L'expression lambda est le deuxième argument de ma méthode .Query. Je suppose que je voudrais utiliser une Action ou une Func, mais je ne suis pas tout à fait sûr de la syntaxe de ceci ou de son fonctionnement. Quelqu'un peut-il me donner un exemple?
Réponses:
Utilisez un
Func<T1, T2, TResult>
délégué comme type de paramètre et transmettez-le à votreQuery
:Vous l'appeleriez:
Ou affectez le lambda à une variable et passez- le .
la source
Si je comprends bien, vous avez besoin du code suivant. (en passant l'expression lambda par paramètre) La méthode
Méthode d'appel
Vous pouvez faire la même chose dans leur classe, voir cet exemple.
Méthode d'appel
J'espère que c'est utile
la source
Compile()
dans le.Where
? J'ai vu que cela fonctionne sans cela aussi.Les expressions Lambda ont un type de
Action<parameters>
(au cas où elles ne renverraient pas de valeur) ouFunc<parameters,return>
(au cas où elles auraient une valeur de retour). Dans votre cas, vous avez deux paramètres d'entrée et vous devez renvoyer une valeur, vous devez donc utiliser:la source
Vous devez utiliser un type de délégué et le spécifier comme paramètre de commande. Vous pouvez utiliser l'un des types de délégués intégrés -
Action
etFunc
.Dans votre cas, il semble que votre délégué prenne deux paramètres et renvoie un résultat, vous pouvez donc utiliser
Func
:Vous pouvez ensuite appeler votre
GetJobs
méthode en passant une instance de délégué. Cela peut être une méthode qui correspond à cette signature, un délégué anonyme ou une expression lambda.PS Vous devriez utiliser PascalCase pour les noms de méthode -
GetJobs
, pasgetJobs
.la source