モデルに対する条件指定

これまで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」プロジェクトが参考になります。