Cómo: Devolver una consulta desde un método (Guía de programación de C#)

En este ejemplo se muestra cómo se devuelve una consulta desde un método como valor devuelto y como parámetro out.

Cualquier consulta debe tener un tipo de IEnumerable o IEnumerable, o un tipo derivado como IQueryable. Por consiguiente, cualquier valor devuelto o parámetro out de un método que devuelve una consulta también debe tener ese tipo. Si un método materializa una consulta en un tipo List o Array concreto, se considera que está devolviendo los resultados de la consulta en lugar de la propia consulta. Una variable de consulta devuelta desde un método se puede componer o modificar.

Ejemplo

En el ejemplo siguiente, el primer método devuelve una consulta como valor devuelto, mientras que el segundo método devuelve una consulta como parámetro out. Tenga en cuenta que, en ambos casos, se devuelve una consulta, no los resultados de la consulta.

class MQ
{
    // QueryMethhod1 returns a query as its value.
    IEnumerable<string> QueryMethod1(ref int[] ints)
    {
        var intsToStrings = from i in ints
                            where i > 4
                            select i.ToString();
        return intsToStrings;
    }

    // QueryMethod2 returns a query as the value of parameter returnQ. 
    void QueryMethod2(ref int[] ints, out IEnumerable<string> returnQ)
    {
        var intsToStrings = from i in ints
                            where i < 4
                            select i.ToString();
        returnQ = intsToStrings;
    }

    static void Main()
    {
        MQ app = new MQ();

        int[] nums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

        // QueryMethod1 returns a query as the value of the method. 
        var myQuery1 = app.QueryMethod1(ref nums);

        // Query myQuery1 is executed in the following foreach loop.
        Console.WriteLine("Results of executing myQuery1:");
        // Rest the mouse pointer over myQuery1 to see its type. 
        foreach (string s in myQuery1)
        {
            Console.WriteLine(s);
        }

        // You also can execute the query returned from QueryMethod1  
        // directly, without using myQuery1.
        Console.WriteLine("\nResults of executing myQuery1 directly:");
        // Rest the mouse pointer over the call to QueryMethod1 to see its 
        // return type. 
        foreach (string s in app.QueryMethod1(ref nums))
        {
            Console.WriteLine(s);
        }


        IEnumerable<string> myQuery2;
        // QueryMethod2 returns a query as the value of its out parameter.
        app.QueryMethod2(ref nums, out myQuery2);

        // Execute the returned query.
        Console.WriteLine("\nResults of executing myQuery2:");
        foreach (string s in myQuery2)
        {
            Console.WriteLine(s);
        }


        // You can modify a query by using query composition. A saved query 
        // is nested inside a new query definition that revises the results 
        // of the first query.
        myQuery1 = from item in myQuery1
                   orderby item descending 
                   select item;

        // Execute the modified query.
        Console.WriteLine("\nResults of executing modified myQuery1:");
        foreach (string s in myQuery1)
        {
            Console.WriteLine(s);
        }

        // Keep console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
} 

Compilar el código

  • Cree un proyecto Visual Studio que tenga como destino la versión 3.5 u otra posterior de.NET Framework. De manera predeterminada, el proyecto incluye una referencia a System.Core.dll y una directiva using para el espacio de nombres System.Linq.

  • Reemplace la clase por el código del ejemplo.

  • Presione F5 para compilar y ejecutar el programa.

  • Presione cualquier tecla para salir de la ventana de consola.

Vea también

Conceptos

Expresiones de consultas LINQ (Guía de programación de C#)