tutorial metodo expresiones español ejemplos c# linq lambda

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.