次のコードを使用して動的にデータをフィルタリングしています (DB エンジンとして MySQL を使用しています)。
var filter = string.Empty;
if (!string.IsNullOrWhiteSpace(filterNumber))
{
filter = "t.Number LIKE :filterNumber";
}
var query = string.Format("SELECT t FROM Table t WHERE 1=1 AND {0} ORDER BY {1} {2}", filter, orderBy, orderDirection);
var q = Session.CreateQuery(query);
if (!string.IsNullOrWhiteSpace(filterNumber))
{
q.SetParameter<string>("filterNumber", "%" + filterNumber + "%");
}
q.SetFirstResult(offset);
q.SetMaxResults(limit);
return q.List<Table>();
filterNumber
( 、orderBy
、orderDirection
、offset
およびlimit
がメソッドのパラメーターであり1=1
、この質問のためだけに追加されたため、クエリは常に機能すると仮定します)
Number が文字列 (MySQL では VARCHAR) 列の場合は機能しますが、日時または整数列の場合は機能しません。
datetime の場合、例外が発生します:
could not execute query […] Name:filterDate - Value:%2012%
および内部例外はSpecified cast is not valid
です。
integer/float カラムの例外は:
could not execute query […] Name:filterPrice - Value:%100%
であり、内部例外はInput string was not in a correct format
です。
(Date
とPrice
は表の別の列)
日付/数値列でこのような LIKE クエリを動的に作成する方法は? この種のクエリは MySQL でうまく機能します。
SELECT * FROM `Table` WHERE `Date` LIKE '%2012%'