私はASP.NET MVCアプリケーションの高度な検索フォームを構築しています。高度な検索のためのコンポーネントとコレクションを含むNHibernate ICriteriaクエリ
私はアドレスのコンポーネントで、Customerオブジェクトを持っている: 流暢NHibernateのマッピング:nullのオブジェクトを防ぐために、私の顧客クラスのctorで
public CustomerMap()
{
WithTable("Customers");
Id(x => x.Id)
.WithUnsavedValue(0)
.GeneratedBy.Identity();
Map(x => x.Name);
Map(x => x.Industry);
Component(x => x.Address, m =>
{
m.Map(x => x.AddressLine);
m.Map(x => x.City);
m.Map(x => x.State);
m.Map(x => x.Zip);
});
、私は次のようしている:
public Customer()
{
Address = new Address();
}
私の検索フォームには、ユーザーが検索するために利用できる次のフィールドがあります。
- Cus tomer名前
- 市
- 州
- 産業
これらのフィールドはすべてオプションです。私はヌルを排除するために().ExcludeZeroesを使用してい
var p = Session.CreateCriteria(typeof(Customer))
.Add(Example.Create(customer).ExcludeZeroes().IgnoreCase().EnableLike())
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Id"), "Id")
.Add(Projections.Property("Name"), "Name")
.Add(Projections.Property("Address.City"), "City")
.Add(Projections.Property("Address.State"), "State")
.Add(Projections.Property("PhoneNumber"), "PhoneNumber"))
.AddOrder(Order.Asc("Name"))
.SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(CustomerDTO)));
return p.List<CustomerDTO>() as List<CustomerDTO>;
お知らせ:
私のNHibernateの基準は、(顧客がASP.NET MVCモデルバインダーを使用して、フォームから渡されている)、このようになります。デフォルト値はゼロです。これは、私のCustomerオブジェクトにはクエリがゼロ(0)にデフォルト設定されるいくつかのINT(簡潔さのためにこの記事では除外されている)があり、不正確なクエリが発生するため必須です。
私は(彼らはオプションなので、OK)空白のすべてのフィールドでこれを実行すると、結果のSQLは次のようになります。
SELECT this_.Id as y0_,
this_.Name as y1_,
this_.City as y2_,
this_.State as y3_,
this_.PhoneNumber as y4_
FROM Customers this_
WHERE (lower(this_.Industry) like '' /* @p0 */
and lower(this_.State) like '' /* @p1 */)
ORDER BY y1_ asc
産業と国家は、Webフォームにドロップダウンしているが、上の例では、それらを空白のままにしました。しかし、ExcludeZeroes()宣言はこれらのフィールドには当てはまらないようです。私は手動で基準の前にチェックした場合
:
if (customer.Address.State == "")
{
customer.Address.State = null;
}
産業のための同じことを行う、基準は、動作します。
私はこのことが私の顧客のアドレスオブジェクトを初期化していると仮定しています。私はそれを変更することはできませんが、フォームから空の文字列値を手動でチェックすることなく、Criteriaを動作させる別の方法はわかりません(ICriteriaでExampleオブジェクトを使用する利点を排除します)。
なぜですか?このCriteriaクエリを機能させるにはどうすればよいですか?
あなたはクエリの例と結婚していますか? –
詳細な検索フォームの場合は、コードをより柔軟にしますが、正確ではありません。私は空の文字列のコンポーネントをチェックしてnullsに変更し、それが動作する場合上記のコードが動作することができます。私はHQLを使用して動作させることもできますが、必要以上に醜いと思われます。私は、QBEが不要なチェックでコードを捨てることなく動作することを期待していました。 –