metodo - C#Pasa la expresión Lambda como parámetro del método
linq lambda c# (4)
Tengo una expresión lambda que me gustaría poder repasar y reutilizar. Aquí está el 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>();
}
La clave aquí, es que quiero poder pasar la expresión lambda que estoy usando aquí en el método que está llamando a este código, para poder reutilizarlo. La expresión lambda es el segundo argumento dentro de mi método .Query. Supongo que querría usar una Acción o un Func, pero no estoy muy seguro de cuál es la sintaxis para esto o cómo funciona. ¿Puede alguien darme un ejemplo?
Debe usar un tipo de delegado y especificarlo como su parámetro de comando. Puede usar uno de los tipos de delegados integrados: Action
y Func
.
En su caso, parece que su delegado toma dos parámetros y devuelve un resultado, por lo que podría usar Func
:
List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)
Luego podría llamar a su método GetJobs
pasando en una instancia de delegado. Este podría ser un método que coincida con esa firma, un delegado anónimo o una expresión lambda.
PD: debe usar PascalCase para nombres de métodos: GetJobs
, no getJobs
.
Las expresiones Lambda tienen un tipo de Action<parameters>
(en caso de que no devuelvan un valor) o Func<parameters,return>
(en caso de que tengan un valor de retorno). En su caso, tiene dos parámetros de entrada y necesita devolver un valor, por lo que debe usar:
Func<FullTimeJob, Student, FullTimeJob>
Si entiendo, necesitas el siguiente código. (pasando la expresión lambda por parámetro) El Método
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étodo de llamada
Method(v => v.Equals(1));
Puedes hacer lo mismo en su clase, mira esto es un ejemplo.
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étodo de llamada
Class.GetList(c=>c.Name=="yourname");
Espero que esto sea útil
Utilice un delegado Func<T1, T2, TResult>
como tipo de parámetro y páselo a su 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>();
}
}
Lo llamarías:
getJobs((job, student) => {
job.Student = student;
job.StudentId = student.Id;
return job;
});
O asigne el lambda a una variable y páselo.