前編では、LightSpeedを使ってモデルを作成する方法を、中編では、エンティティを操作する基本的な方法を紹介しました。後編にあたる本編では、クエリの書き方とエンティティに振る舞いを追加する方法について紹介します。

QueryExpressionクラスによる条件指定

前回、データを全件取得するFindメソッドと、キー値でデータを1件取得するFindOneメソッドを紹介しました。 今回は、条件を指定してデータを抽出する方法について紹介します。まず、コード例を見てみましょう。ここではFindOneメソッドでDvdのデータを1件取り出しています。

QueryExpressionの使用例

private void btnQuery_Click(object sender, EventArgs e)
{
  using (LsUnitOfWork uow = _context.CreateUnitOfWork())
  {
    //DVDのタイトルが「あいう」
    QueryExpression q = 
        Dvd.Attribute("Title") == "あいう";

    Dvd d = uow.FindOne(q);
  }
}

QueryExpressionは、エンティティの抽出条件を格納できるクラスです。ここでは「Dvd.Attribute("Title") == "あいう"」と指定して、DVDのタイトルが"あいう"のデータを取得しています。QueryExpressionは「エンティティのAttributeメソッド」+「演算子(またはメソッド)」+「比較する値(文字列、数値、日付、真偽値等)」の組み合わせで構成されます。

このQueryExpressionクラスをFindOneメソッドの引数に指定すると、その条件でデータを抽出できます。ただし、FindOneメソッドで複数件のデータが取得されるとエラーが発生しますので注意してください。

複数の条件指定

QueryExpressionクラスでは、複数の条件を指定することができます。次はFindメソッドを使用してDvdデータを取り出してみます。

QueryExpressionに複数条件を指定

//DVDのタイトルが「あいう」でなく、かつ、区分が1か2
QueryExpression qe =
    Dvd.Attribute(Dvd.TitleField) != "あいう"
    && Dvd.Attribute(Dvd.TypeField).In(1, 2);

IList list = uow.Find(qe);

ここでは、タイトルと区分を条件に指定しています。InメソッドはSQLのIN句に展開されます。Attributeメソッドの引数で文字列をベタに書きたくない場合は、このようにエンティティの定数を使用することもできます。

条件の組み合わせ

複雑な条件を組み立てる例も見ておきましょう。

QueryExpressionの組み合わせ

//条件1:タイトルに「あいう」を含む
QueryExpression qe1 =
    Dvd.Attribute("Title").Like("%あいう%");

//条件2:URLが「jp」で終わる
QueryExpression qe2 =
    Dvd.Attribute("InfoUrl").Like("%jp");

//条件3:区分が1以上
QueryExpression qe3 =
    Dvd.Attribute("Type") >= 1;

//条件1でなく かつ 条件2または条件3
QueryExpression qeAll = !qe1 && (qe2 || qe3);

IList list = uow.Find(qeAll);

この例では複数のQueryExpression変数を組み合わせて、1つのQueryExpression(qeAll)を作成しています。この機能を使うことで、検索条件が複雑であっても、上手くクエリを組み立てることができます。