モデルに対する条件指定
これまでSQLに似た機能を中心に紹介してきましたが、LightSpeedではモデルの構造に対してクエリを書くこともできます。
オブジェクトの階層をたどって条件を指定(親→子)
//Dvdタイトルに「あいう」という文字が含まれているRentalエンティティ
QueryExpression q1 =
Rental.Attribute("Dvds.Title").Like("%あいう%");
IList list1 = uow.Find(q1);
//LINQ to ObjectsでUI用に整形
var disp1 = from rental in list1
from dvd in rental.Dvds
orderby rental.Id,dvd.Title
select new
{
レンタル日数 = rental.DaySpan,
タイトル = dvd.Title
};
dataGridView1.DataSource = disp1.ToList();
この例では「Rental.Attribute("Dvds.Title")」というコードがありますが、これは「Rentalエンティティ→Dvdsプロパティ→Titleプロパティ」に対して条件を指定しています。つまり、QueryExpressionではテーブル構成を意識することなく、オブジェクトのパスを指定してデータを取得することができます。 同様にDvdエンティティからRentalエンティティを参照して条件を指定することもできます。
オブジェクトの階層をたどって条件を指定(子→親)
//期間が3日のレンタルに含まれるDVD一覧
QueryExpression q2 =
Dvd.Attribute("Rental.DaySpan") == 3;
IList list2 = uow.Find(q2);
//LINQ to ObjectsでUI用に整形
var disp2 = from dvd in list2
orderby dvd.RentalId, dvd.Title
select new
{
レンタル日数 = dvd.Rental.DaySpan,
タイトル = dvd.Title
};
dataGridView1.DataSource = disp2.ToList();
ここでは「Dvd.Attribute("Rental.DaySpan")」というコードで、「Dvdエンティティ→Rentalプロパティ→DaySpanプロパティ」の値を条件に指定しています。
LightSpeedのLINQ機能
上のコード例では、取得したIList<Dvd>に対して、LINQ to Objectsを使って表示用のデータを整形していましたが、実はLsUnitOfWorkクラス自体もLINQに対応しています。
LightSpeedのLINQ機能
var disp = from dvd in uow.Dvds
where dvd.Rental.DaySpan == 3
orderby dvd.RentalId ,dvd.Title
select new
{
レンタル日数 = dvd.Rental.DaySpan,
タイトル = dvd.Title
};
dataGridView1.DataSource = disp.ToList();
ここでは「from dvd in uow.Dvds」というように、LsUnitOfWorkクラスのDvdsプロパティに対してLINQのクエリを書いています。先ほどは、SQL実行とLINQ to Objectsの2回の記述が必要だった部分が、1回の記述で完結しています。このLINQ機能もLightSpeedの便利な機能の1つと言えるでしょう。
サンプルについて
クエリ機能の詳細については、インストールされるサンプルの「Queries」プロジェクトが参考になります。LINQ機能の詳細については、同サンプルの「LINQ Queries」プロジェクトが参考になります。