Mam wyrażenie lambda, które chciałbym móc przekazać i ponownie wykorzystać. Oto kod:
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>();
}
Kluczem tutaj jest to, że chcę móc przekazać wyrażenie lambda, którego używam tutaj, do metody, która wywołuje ten kod, aby móc go ponownie użyć. Wyrażenie lambda jest drugim argumentem wewnątrz mojej metody .Query. Zakładam, że chciałbym użyć Action lub Func, ale nie jestem do końca pewien, jaka jest składnia tego lub jak to działa. Czy ktoś może mi podać przykład?
Odpowiedzi:
Użyj
Func<T1, T2, TResult>
delegata jako typu parametru i przekaż go doQuery
:Nazwałbyś to:
Lub przypisz lambdę do zmiennej i przekaż ją .
źródło
Jeśli rozumiem, potrzebujesz następującego kodu. (przekazywanie wyrażenia lambda przez parametr) Metoda
Metoda wywołania
Możesz zrobić to samo w swojej klasie, zobacz przykład.
Metoda wywołania
Mam nadzieję, że to się przyda
źródło
Compile()
w.Where
? Widziałem, że działa również bez tego.Wyrażenia lambda mają typ
Action<parameters>
(w przypadku, gdy nie zwracają wartości) lubFunc<parameters,return>
(w przypadku, gdy mają wartość zwracaną). W twoim przypadku masz dwa parametry wejściowe i musisz zwrócić wartość, więc powinieneś użyć:źródło
Należy użyć typu delegata i określić go jako parametr polecenia. Możesz użyć jednego z wbudowanych typów delegatów -
Action
iFunc
.W twoim przypadku wygląda na to, że delegat pobiera dwa parametry i zwraca wynik, więc możesz użyć
Func
:Następnie możesz wywołać
GetJobs
metodę przekazywania w instancji delegata. Może to być metoda, która pasuje do tego podpisu, anonimowego delegata lub wyrażenia lambda.PS Powinieneś używać PascalCase do nazw metod -
GetJobs
niegetJobs
.źródło