Eu tenho uma expressão lambda que gostaria de poder transmitir e reutilizar. Aqui está o código:
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>();
}
A chave aqui é que eu quero ser capaz de passar a expressão lambda que estou usando aqui para o método que está chamando este código, para que eu possa reutilizá-la. A expressão lambda é o segundo argumento dentro do meu método .Query. Estou supondo que gostaria de usar uma ação ou função, mas não tenho certeza de qual é a sintaxe para isso ou como funciona. Alguém pode me dar um exemplo?
Respostas:
Use um
Func<T1, T2, TResult>
delegado como o tipo de parâmetro e passe-o para o seuQuery
:Você o chamaria de:
Ou atribua o lambda a uma variável e passe -o .
fonte
Se eu entender, você precisa seguir o código. (passando a expressão lambda por parâmetro) O Método
Método de chamada
Você pode fazer o mesmo em sua classe, veja este é um exemplo.
Método de chamada
Espero que seja útil
fonte
Compile()
do.Where
? Eu vi que funciona sem isso também.As expressões lambda têm um tipo de
Action<parameters>
(caso não retornem um valor) ouFunc<parameters,return>
(caso tenham um valor de retorno). No seu caso, você tem dois parâmetros de entrada e precisa retornar um valor, então você deve usar:fonte
Você deve usar um tipo de delegado e especificá-lo como seu parâmetro de comando. Você pode usar um dos tipos integrados de delegado -
Action
eFunc
.No seu caso, parece que seu delegado usa dois parâmetros e retorna um resultado, então você pode usar
Func
:Você pode então chamar seu
GetJobs
método passando em uma instância delegada. Pode ser um método que corresponda a essa assinatura, um delegado anônimo ou uma expressão lambda.PS Você deve usar PascalCase para nomes de métodos -
GetJobs
, nãogetJobs
.fonte