C # Passa l’espressione lambda come parametro del metodo

Ho un’espressione lambda che mi piacerebbe poter passare e riutilizzare. Ecco il codice:

public List getJobs(/* i want to pass the lambda expr in here */) { using (SqlConnection connection = new SqlConnection(getConnectionString())) { connection.Open(); return connection.Query(sql, (job, student) => { job.Student = student; job.StudentId = student.Id; return job; }, splitOn: "user_id", param: parameters).ToList(); } 

La chiave qui, voglio essere in grado di passare l’espressione lambda che sto usando qui nel metodo che chiama questo codice, quindi posso riutilizzarlo. L’espressione lambda è il secondo argomento nel mio metodo .Query. Suppongo che vorrei usare un’azione o Func, ma non sono abbastanza sicuro di quale sia la syntax per questo o di come funzioni. Qualcuno può darmi un esempio?

Utilizza un Func delegate come tipo di parametro e Func alla tua Query :

 public List getJobs(Func lambda) { using (SqlConnection connection = new SqlConnection(getConnectionString())) { connection.Open(); return connection.Query(sql, lambda, splitOn: "user_id", param: parameters).ToList(); } } 

Lo chiameresti:

 getJobs((job, student) => { job.Student = student; job.StudentId = student.Id; return job; }); 

Oppure assegna il lambda a una variabile e passa.

Se capisco, hai bisogno di seguire il codice. (passaggio espressione lambda per parametro) Il metodo

 public static void Method(Expression> 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 } 

Metodo di chiamata

 Method(v => v.Equals(1)); 

Puoi fare lo stesso nella loro class, vedi questo è un esempio.

 public string Name {get;set;} public static List GetList(Expression> predicate) { List c = new List(); 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; } 

Metodo di chiamata

 Class.GetList(c=>c.Name=="yourname"); 

Spero che questo sia utile

Le espressioni Lambda hanno un tipo di Action (nel caso in cui non restituiscano un valore) o Func (nel caso in cui abbiano un valore di ritorno). Nel tuo caso hai due parametri di input e devi restituire un valore, quindi dovresti usare:

 Func 

È necessario utilizzare un tipo di delegato e specificarlo come parametro di comando. È ansible utilizzare uno dei tipi di delegati incorporati: Action e Func .

Nel tuo caso, sembra che il tuo delegato prenda due parametri e restituisca un risultato, quindi potresti usare Func :

 List GetJobs(Func projection) 

È quindi ansible chiamare il metodo GetJobs passando a un’istanza delegata. Questo potrebbe essere un metodo che corrisponde a quella firma, un delegato anonimo o un’espressione lambda.

PS Dovresti usare PascalCase per i nomi dei metodi – GetJobs , non getJobs .