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 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 un Func, mais je ne suis pas sûr de la syntaxe de ce script ni de son fonctionnement. Quelqu'un peut-il s'il vous plaît me donner un exemple?
Utilisez un délégué Func<T1, T2, TResult>
comme type de paramètre et transmettez-le à votre Query
:
_public List<IJob> getJobs(Func<FullTimeJob, Student, FullTimeJob> lambda)
{
using (SqlConnection connection = new SqlConnection(getConnectionString())) {
connection.Open();
return connection.Query<FullTimeJob, Student, FullTimeJob>(sql,
lambda,
splitOn: "user_id",
param: parameters).ToList<IJob>();
}
}
_
Vous l'appelleriez:
_getJobs((job, student) => {
job.Student = student;
job.StudentId = student.Id;
return job;
});
_
Ou assignez le lambda à une variable et passez le au format.
Si j'ai bien compris, vous avez besoin du code suivant. (passage de l'expression lambda par paramètre) La méthode
public static void Method(Expression<Func<int, bool>> predicate) {
int[] number={1,2,3,4,5,6,7,8,9,10};
var newList = from x in number
.Where(predicate.Compile()) //here compile your clausuly
select x;
newList.ToList();//return a new list
}
Méthode d'appel
Method(v => v.Equals(1));
Vous pouvez faire la même chose dans leur classe, voir cet exemple.
public string Name {get;set;}
public static List<Class> GetList(Expression<Func<Class, bool>> predicate)
{
List<Class> c = new List<Class>();
c.Add(new Class("name1"));
c.Add(new Class("name2"));
var f = from g in c.
Where (predicate.Compile())
select g;
f.ToList();
return f;
}
Méthode d'appel
Class.GetList(c=>c.Name=="yourname");
J'espère que c'est utile
Les expressions Lambda ont le type Action<parameters>
(au cas où elles ne renverraient pas de valeur) ou Func<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:
Func<FullTimeJob, Student, FullTimeJob>
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
et Func
.
Dans votre cas, il semble que votre délégué prenne deux paramètres et renvoie un résultat. Vous pouvez donc utiliser Func
:
List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)
Vous pouvez ensuite appeler votre méthode GetJobs
en lui transmettant 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.
P.S. Vous devez utiliser PascalCase pour les noms de méthode - GetJobs
, pas getJobs
.