C# Pasar Expresión Lambda como Parámetro de Método

Tengo una expresión lambda que me gustaría ser capaz de pasar de todo y la reutilización. 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 ser capaz de pasar de la expresión lambda que estoy usando aquí en el método de llamar a este código, así que se pueden reutilizar. La expresión lambda es el segundo argumento dentro de mi .El método de consulta. Estoy suponiendo que me gustaría utilizar una Acción o Func, pero no estoy muy seguro de lo que la sintaxis es por esto o cómo funciona bastante. Por favor alguien puede darme un ejemplo?

InformationsquelleAutor Adam Levitt | 2013-01-12

4 Kommentare

  1. 115

    Utilizar un Func<T1, T2, TResult> delegado, según el tipo de parámetro y de paso 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>();   
      }  
    }

    Usted diría que es:

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

    O asignar la lambda a una variable y pasar se en.

    • Esto se ve muy bueno, y ¿cómo podría definir el lambda FUERA de este getJobs método? En otras palabras, ¿cuál es la línea antes de la llamada a getJobs() se parecen a definir la lambda?
    • Misma manera que usted tiene con su código de ejemplo. Va a añadir a la respuesta.
    • También, los parámetros de la función de ser dinámico, de todos modos?
    • usted puede hacer la función genérica, aunque si quieres un número diferente de parámetros en las funciones lambda, tendrá sobrecargas.
    • A la derecha. Lo que en realidad me gustaría es ser capaz de pasar en diferentes implementaciones de la IJob interfaz, pero eso no va a funcionar con ubuntu Dapper Consulta del<> ya que requiere el real genérico impl clase en tiempo de ejecución. Esto todavía es bastante cercano a lo que yo estaba esperando.
  2. 23

    Si entiendo que necesita código siguiente. (pasando 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));

    Usted puede hacer lo mismo en su clase, ver este es el 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

    • Puede usted explicar por qué necesitamos la Compile() en el .Where? He visto que funciona sin que demasiado.
  3. 7

    Las expresiones Lambda tienen un tipo de Action<parameters> (en caso de que no devuelven un valor) o Func<parameters,return> (en caso de que tengan un valor de retorno). En tu caso, tienes dos parámetros de entrada, y necesita devolver un valor, por lo que se debe utilizar:

    Func<FullTimeJob, Student, FullTimeJob>
  4. 4

    Debe utilizar un tipo de delegado y especificar que como su parámetro de comando. Usted podría utilizar uno de los construidos en los tipos de delegado – Action y Func.

    En su caso, se ve como su delegado toma dos parámetros y devuelve un resultado, así que usted podría utilizar Func:

    List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)

    Entonces, usted puede llamar a su GetJobs método de paso en una instancia de delegado. Este podría ser un método que coincida con la firma, un anónimo delegado, o una expresión lambda.

    P. S. debe utilizar PascalCase para los nombres de método – GetJobs, no getJobs.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...