This project is read-only.

目次

概要

SQL記述 の式コメントには簡易的な式言語を使用できます。
ここでは式言語の文法を説明します。

識別子

識別子はquery関数やQueryメソッドで渡されるパラメータを表します。
次に例を示します。

F#
let empList = 
  Db.query<Employee>
    config
    "select * from Employee where Age > /* min */10 and Age < /* max */30"
    ["min" @= 5; "max" @= 35]
C#
var empList = 
  db.Query<Employee>(
    "select * from Employee where Age > /* min */10 and Age < /* max */30",
    new { min = 5, max = 35 } );
この例では min と max が識別子です。


識別子の文字には、数値、アルファベット、アンダースコアを使用できます。
ただし、[ と ] で囲むことで任意の文字列を識別子として利用できます。
次に例を示します。

F#
let empList = 
  Db.query<Employee>
    config
    "select * from Employee where Age > /* [最小] */10 and Age < /* [最大] */30"
    ["最小" @= 5; "最大" @= 35]
C#
var empList = 
  db.Query<Employee>(
    "select * from Employee where Age > /* [最小] */10 and Age < /* [最大] */30",
    new { 最小 = 5, 最大 = 35 } );
この例では 最小 と 最大 が識別子です。

リテラル

以下のリテラルを使用可能です。

サンプルリテラル
System.Object null
System.Boolean true, false
System.Byte 0uy, 19uy
System.SByte 0y, 19y
System.Int16 0s, 19s
System.UInt16 0us, 19us
System.Int32 0, 19
System.UInt32 0u, 19u
System.Int64 0L, 19L
System.UInt64 0UL, 19UL
System.Single 0.0f, 19.7f
System.Double 0.0, 19.7
System.Decimal 0M, 19M, 19.03M
Math.BigInt 0I, 19I
System.String 'abc'


例を示します。

select * from Employee where 
/*% if employeeName <> null && employeeName.Lenght > 5 */
    EmployeeName = /* employeeName */'smith'
/*% end */

この例では、nullリテラルと数値リテラルを使用しています。

比較演算子

以下の比較演算子を使用可能です。

演算子 説明
= 等値演算子
== 等値演算子
<> 不等演算子
!= 不等演算子
< 小なり演算子
<= 小なりイコール演算子
> 大なり演算子
>= 大なりイコール演算子


大なり演算子を使用する例を示します。

select * from Employee where 
/*%if employeeName.Length > 0 */
    EmployeeName = /* employeeName */'smith'
/*%end */

比較演算子を利用するには、 被演算子の型がその演算子をサポートしている必要があります。

論理演算子

以下の論理演算子を使用できます。

演算子 説明
not 論理否定演算子
! 論理否定演算子
&& 論理積演算子
|| 論理和演算子


論理和演算子と論理積演算を使用する例を示します。

select * from Employee where 
/*%if (departmentId = null || managerId = null) && employee_name <> null */
    EmployeeName = /* employeeName */'smith'
/*%end */

演算子が適用される優先度は括弧を利用して制御できます。

式言語の中において、値は型をもちます。したがって、異なる型同士の演算はできません。

オプション型

オプション型は、nullリテラルと比較することでSomeかNoneかを判別できます。
以下に例を示します。

select * from Employee where 
/*%if employeeId <> null */
    EmployeeId = /* employeeId */0
/*%end */
employeeIdがオプション型です。値がSomeの場合にのみEmployeeIdと比較するSQLを生成します。

null許容型

null許容型は、nullリテラルと比較することで値をもっているかどうかを判別できます。
以下に例を示します。

select * from Employee where 
/*%if employeeId <> null */
    EmployeeId = /* employeeId */0
/*%end */
employeeIdがnull許容型です。値を持つ場合にのみEmployeeIdと比較するSQLを生成します。

プロパティアクセス

ここでのプロパティは、.NETのプロパティとフィールドの両方を含みます。
プロパティアクセスには非staticなプロパティへのアクセスとstaticなプロパティへのアクセスの2種類があります。publicな可視性を持つプロパティに対してのみアクセス可能です。
基本としてインデクサにはアクセスできませんが、System.Collections.IDictionaryとSystem.Collections.Generic.IDictionary<TKey, TValue>のインデクサについてのみ例外です。プロパティへのアクセスがインデクサによるアクセスに変換されて実行されます。
プロパティへのアクセスは読み取りのみ可能です。書き込みはできません。また、プロパティの大文字/小文字は区別されます。

非staticなプロパティへのアクセス

ドット(.)でプロパティ名をつなげてアクセスします。

通常のインスタンスへのプロパティアクセスの例を以下に示します。
次の例では、バインド変数コメント内でEmployeeインスタンスのEmployeeNameプロパティにアクセスしています。

F#
let emp = { Employee.EmployeeId = 0; EmployeeName = "Hoge"; DepartmentId = 2; VersionNo = 0}
let empList = Db.query<Employee> config "select * from Employee where EmployeeName = /* emp.EmployeeName */'smith'" ["emp" @= emp]

System.Collections.Generic.IDictionary<String, Object>のインデクサを介したアクセスの例を以下に示します。
次の例では、"EmployeeName" をキーとして IDictionary<String, Object>のインデクサにアクセスしています。記法は、通常のインスタンスへのプロパティアクセスと同様ですが、内部的にはインデクサを介してアクセスされます。

F#
let emp = new Dictionary<string, obj>()
emp.["EmployeeName"] <- "Hoge"
let empList = Db.query<Employee> config "select * from Employee where EmployeeName = /* emp.EmployeeName */'smith'" ["emp" @= emp]

staticなプロパティへのアクセス

型名を$で囲み、その後ろにドット(.)とプロパティ名をつなげてアクセスします。例を示します。

update Employee set EmployeeName = /* employeeName */, ModifiedTime = /* $System.DateTime$.Now */ where = /* employeeId */1

この例では、バインド変数コメント内でSystem.DateTimeのNowプロパティにアクセスしています。

組み込み関数

組み込み関数は、値の評価と変換を行うためのユーティリティです。組み込み関数には次の種類があります。F#のシグネチャの形式で示します。

シグネチャ 説明
val isNullOrEmpty : System.Object -> System.Boolean 値がnullもしくは空の場合にtrueを返します。引数の型がOption<String>の場合、要素の値が評価されます。
val isNullOrWhiteSpace : System.Object -> System.Boolean 値がnullもしくは空白の場合にtrueを返します。引数の型がOption<String>の場合、要素の値が評価されます。
val date : System.Object -> System.Nullable<System.DateTime> 値から日付部分のみを取り出して返します。引数の型がOption<DateTime>やNullable<DateTime>の場合、要素の値が評価されます。
val nextDate : System.Object -> System.Nullable<System.DateTime> 値から日付部分のみを取り出し1日前に進めて返します。引数の型がOption<DateTime>やNullable<DateTime>の場合、要素の値が評価されます。
val prevDate : System.Object -> System.Nullable<System.DateTime> 値から日付部分のみを取り出し1日後ろに戻して返します。引数の型がOption<DateTime>やNullable<DateTime>の場合、要素の値が評価されます。
val escape : System.Object -> System.String LIKE検索のために文字列に含まれるワイルドカード(%_など)を$でエスケープします。引数がnullの場合、戻り値はnullになります。パラメータの型がOption<String>の場合、要素の値が評価されます。
val startsWith : System.Object -> System.String 値を前方一致検索のための文字列へ変換します。また、文字列に含まれるワイルドカード(%_など)を$でエスケープします。引数がnullの場合、戻り値はnullになります。パラメータの型が引数<String>の場合、要素の値が評価されます。
val contains : System.Object -> System.String 値を中間一致検索のための文字列へ変換します。文字列に含まれるワイルドカード(%_など)を$でエスケープします。引数がnullの場合、戻り値はnullになります。引数の型がOption<String>の場合、要素の値が評価されます。
val endsWith : System.Object -> System.String 値を後方一致検索のための文字列へ変換します。文字列に含まれるワイルドカード(%_など)を$でエスケープします。引数がnullの場合、戻り値はnullになります。引数の型がOption<String>の場合、要素の値が評価されます。
val charString: System.Object -> Soma.Core.CharString 値をSoma.Core.CharStringへ変換します。引数がnullの場合、戻り値はnullになります。引数の型がOption<String>の場合、要素の値が評価されます。
val charStringList: System.Object -> System.Collections.IEnumerable<Soma.Core.CharString> 値をSoma.Core.CharStringのIEnumerableへ変換します。引数がnullの場合、戻り値は空のIEnumerableになります。


C#やVB.NETのメソッドに合わせたシノニムがあります。C#の構文で示します。

構文 説明
System.Boolean @IsNullOrEmpty(System.Object text) isNullOrEmptyのシノニムです。
System.Boolean @isNullOrWhiteSpace(System.Object text) isNullOrEmptyのシノニムです。
System.Nullable<System.DateTime> @Date(System.Object date) dateのシノニムです。
System.Nullable<System.DateTime> @NextDate(System.Object date) nextDateのシノニムです。
System.Nullable<System.DateTime> @PrevDate(System.Object date) prevDateのシノニムです。
System.String @Escape(System.Object text) escapeのシノニムです。
System.String @StartsWith(System.Object text) startsWithのシノニムです。
System.String @Contains(System.Object text) containsのシノニムです。
System.String @EndsWith(System.Object text) endsWithのシノニムです。
Soma.Core.CharString @CharString(System.Object text) charStringのシノニムです。
System.Collections.IEnumerable<Soma.Core.CharString> @CharStringList(System.Object textList) charStringListのシノニムです。

isNullOrEmpty

isNullOrEmpty を使用すると文字列がnullもしくは空文字である場合の条件式を簡潔に記述できます。
例を示します。

select * from Employee where 
/*%if not (isNullOrEmpty employeeName) */
    EmployeeName = /* employeeName */'smith'
/*%end */

これは、次のように記述するのと意味的に等価です。

select * from Employee where 
/*%if employeeName <> null && employeeName.Length > 0 */
    EmployeeName = /* employeeName */'smith'
/*%end */

シノニムである@IsNullOrEmptyを使うこともできます。また、not 演算子 は ! 演算子で記述できます。

select * from Employee where 
/*%if ! @IsNullOrEmpty(employeeName) */
    EmployeeName = /* employeeName */'smith'
/*%end */

isNullOrWhiteSpace

isNullOrWhiteSpaceを使用すると文字列がnull、空文字、もしくは空白である場合の条件式を記述できます。
例を示します。

select * from Employee where 
/*%if not (isNullOrWhiteSpace employeeName) */
    EmployeeName = /* employeeName */'smith'
/*%end */

シノニムである@IsNullOrWhiteSpaceを使うこともできます。また、not 演算子 は ! 演算子で記述できます。

select * from Employee where 
/*%if ! @IsNullOrWhiteSpace(employeeName) */
    EmployeeName = /* employeeName */'smith'
/*%end */

date

dateを使用するとDateTimeの値から日付部分だけを抽出できます。この関数は時間部分を切り捨てたい場合に使用します。
例を示します。

select * from Employee where Hiredate > /* date hiredate */'2001-01-01'

シノニムである@Dateを使うこともできます。

select * from Employee where Hiredate > /* @Date(hiredate) */'2001-01-01'

nextDate

nextDateを使用するとDateTimeの値から日付部分だけを抽出し1日前に進めた日付を取得できます。この関数は時間部分を切り捨てたい場合に使用します。
例を示します。

select * from Employee where Hiredate > /* nextDate hiredate */'2001-01-01'

シノニムである@NextDateを使うこともできます。

select * from Employee where Hiredate > /* @NextDate(hiredate) */'2001-01-01'

prevDate

prevDateを使用するとDateTimeの値から日付部分だけを抽出し1日後ろに戻した日付を取得できます。この関数は時間部分を切り捨てたい場合に使用します。
例を示します。

select * from Employee where Hiredate >= /* prevDate hiredate */'2001-01-01' and Hiredate < /* nextDate hiredate */'2001-01-01'

シノニムである@PrevDateを使うこともできます。

select * from Employee where Hiredate >= /* @PrevDate(hiredate) */'2001-01-01' and Hiredate < /* @NextDate(hiredate) */'2001-01-01'

escape

escapeを使用すると文字列に含まれるLIKE検索用のワイルドカードをエスケープできます。
例を示します。

select * from Employee where EmployeeName like /* escape employeeName */'smith' escape '$'

この例では、プログラムから渡されるemployeeNameの値が AB%C である場合、escapeにより値は AB$%C に変換されます。 escapeを利用する場合、SQLには escape '$' を必ず指定してください。

シノニムである@Escapeを使うこともできます。

select * from Employee where EmployeeName like /* @Escape(employeeName) */'smith' escape '$'

startsWith

startsWithを使用すると文字列をLIKE検索で使用可能な前方一致検索用の文字列に変換できます。
例を示します。

select * from Employee where EmployeeName like /* startsWith employeeName */'smith' escape '$'

この例では、プログラムから渡されるemployeeNameの値が ABC である場合、startsWithにより値は ABC% に変換されます。もし、employeeNameの値が AB%C というように % を含んでいる場合、% は $ でエスケープされ、値は AB$%C% に変換されます。 startsWithを利用する場合、SQLには escape '$' を必ず指定してください。

シノニムである@StartsWithを使うこともできます。

select * from Employee where EmployeeName like /* @StartsWith(employeeName) */'smith' escape '$'

contains

containsを使用すると文字列をLIKE検索で使用可能な中間一致検索用の文字列に変換できます。
例を示します。

select * from Employee where EmployeeName like /* contains employeeName */'smith' escape '$'

この例では、プログラムから渡されるemployeeNameの値が ABC である場合、containsにより値は %ABC% に変換されます。もし、employeeNameの値が AB%C というように % を含んでいる場合、 % は $ でエスケープされ、値は %AB$%C% に変換されます。 containsを利用する場合、SQLには escape '$' を必ず指定してください。

シノニムである@Contains を使うこともできます。

select * from Employee where EmployeeName like /* @Contains(employeeName) */'smith' escape '$'

endsWith

endsWithを使用すると文字列をLIKE検索で使用可能な後方一致検索用の文字列に変換できます。
例を示します。

select * from Employee where EmployeeName like /* endsWith employeeName */'smith' escape '$'

この例では、プログラムから渡されるemployeeNameの値が「ABC」である場合、endsWithにより値は %ABC に変換されます。もし、employeeNameの値が AB%C というように % を含んでいる場合、 % は $ でエスケープされ、値は %AB$%C に変換されます。 endsWithを利用する場合、SQLには escape '$' を必ず指定してください。

シノニムである@EndsWithを使うこともできます。

select * from Employee where EmployeeName like /* @EndsWith(employeeName) */'smith' escape '$'

Last edited Jun 23, 2012 at 8:17 AM by toshihiro, version 23

Comments

No comments yet.