コレクションの指定と射影
最終更新:
atachi
コレクションの指定(from-in句)
SQLではテーブルの指定でFROM句に相応します。
var q1 = from p in persons select p;
from-in-selectの組み合わせはLINQではもっともよく使われるキーワードの組み合わせで、SQLのSELECT文のように使います。
from X in COLLECTION
という記述は、任意のコレクション(COLLECTION)のエイリアス名として「X」をつけています。
使用可能なコレクション
- IEnumerable
- IEnumerable<T>
- IQueryable<T>
上記のいずれかのインターフェースを実装しているクラスがLINQで使用できるコレクションです。
IEnumerable<T>やIQueryable<T>はジェネリクスコレクションなので型推論がコンパイラによって自動的に行われますが、IEnumerableのコレクションの場合は型情報が存在しないためLINQはobject型として処理を行います。
この場合、where句を使った場合にプロパティの参照ができないなどの問題が発生します。
ArrayListなどの非ジェネリクスなコレクションを使用している場合で、型がわかっている場合には次の記述方法をして型情報をLINQに与えることも可能です。
from Person x in persons
射影(select句)
クエリー結果をどのような構造で出力するかを射影と呼びます。
SQLではSELECT構文となります。SQLと異なりLINQではselect句はクエリの最後に記述します。
-
抽出結果をそのままの構造で返す
var q1 = from p in persons select p;
-
新しい構造を作成し返す
var q1 = from p in persons select new{FullName=p.Name};
サンプルコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinqTest
{
class Program
{
static void Main(string[] args)
{
IEnumerable<Person> persons = CreateData();
var query = from person in persons
select person;
foreach (var person in query)
{
Console.WriteLine("Name={0}", person.Name);
}
Console.WriteLine("finish.");
Console.ReadLine();
}
static IEnumerable<Person> CreateData()
{
return new Person[] {
new Person{Name="博麗 霊夢"},
new Person{Name="霧雨 魔理沙"},
new Person{Name="十六夜 咲夜"},
new Person{Name="中国"},
new Person{Name="西行寺 幽々子"},
new Person{Name="八雲 紫"},
new Person{Name="鈴仙・優曇華院・イナバ"},
new Person{Name="八意 永琳"}
};
}
}
class Person
{
public string Name { get; set; }
}
}