メソッドからクエリを返す方法

この例では、メソッドから、クエリを戻り値として返す方法と out パラメーターとして返す方法を示します。

クエリ オブジェクトはコンポーザブルです。つまり、メソッドからクエリを返すことができます。 クエリを表すオブジェクトには、結果のコレクションではなく、必要に応じて結果を生成する手順が格納されます。 メソッドからクエリ オブジェクトを返すメリットは、そのオブジェクトをさらに構成したり変更したりできることです。 そのため、クエリを返すメソッドの戻り値または out パラメーターも同じ型である必要があります。 メソッドがクエリを具象型 List<T> または Array に実体化する場合は、そのメソッドは、クエリ自体ではなくクエリ結果を返すと見なされます。 メソッドから返されたクエリ変数は、引き続き構成または変更できます。

次の例で、1 番目のメソッド QueryMethod1 はクエリを戻り値として返し、2 番目のメソッド QueryMethod2 はクエリを out パラメーター (例では returnQ) として返します。 どちらの場合も返されるのはクエリであり、クエリ結果ではないことにご注意ください。

IEnumerable<string> QueryMethod1(int[] ints) =>
    from i in ints
    where i > 4
    select i.ToString();

void QueryMethod2(int[] ints, out IEnumerable<string> returnQ) =>
    returnQ =
        from i in ints
        where i < 4
        select i.ToString();

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

var myQuery1 = QueryMethod1(nums);

クエリ myQuery1 は、次の foreach ループで実行されます。

foreach (var s in myQuery1)
{
    Console.WriteLine(s);
}

マウス ポインターで myQuery1 をポイントすると、その型が表示されます。

myQuery1 を使わず、直接 QueryMethod1 から返されたクエリも実行できます。

foreach (var s in QueryMethod1(nums))
{
    Console.WriteLine(s);
}

QueryMethod1 の呼び出しをマウス ポインターでポイントすると、戻り値の型が表示されます。

QueryMethod2 は、クエリを out パラメーターの値として返します。

QueryMethod2(nums, out IEnumerable<string> myQuery2);

// Execute the returned query.
foreach (var s in myQuery2)
{
    Console.WriteLine(s);
}

クエリの構成を使って、クエリを変更できます。 この例では、前のクエリ オブジェクトを使って新しいクエリ オブジェクトが作成されています。 この新しいオブジェクトは、元のクエリ オブジェクトとは異なる結果を返します。

myQuery1 =
    from item in myQuery1
    orderby item descending
    select item;

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

関連項目