Nhibernateを使用してデータをフィルタリングする一般的なソリューションに取り組んでいます。このUnfortunatley汎用データグリッドフィルタリング
private ICriteria GetPagedCriteria<T>(GridResult<T> GridResult, bool sort)
{
var query = Session.CreateCriteria(typeof(T));
foreach (string alias in GridResult.NHibernatePaths)
{
query.CreateAlias(alias, alias.Replace(".", "_"));
}
foreach (PropertyValueOperators pvo in GridResult.FilterList)
{
if(String.IsNullOrEmpty(pvo.Value) == false)
{
switch (pvo.LikeOperator)
{
case "Contains":
query.Add(Expression.InsensitiveLike(Projections.Cast(NHibernateUtil.String, Projections.Property(pvo.Property)), String.Format("%{0}%",pvo.Value), MatchMode.Exact));
break;
case "EndsWith":
query.Add(Expression.InsensitiveLike(Projections.Cast(NHibernateUtil.String, Projections.Property(pvo.Property)), String.Format("%{0}", pvo.Value), MatchMode.Exact));
break;
case "Equals":
query.Add(Expression.InsensitiveLike(Projections.Cast(NHibernateUtil.String, Projections.Property(pvo.Property)), pvo.Value, MatchMode.Exact));
break;
case "Starts With":
query.Add(Expression.InsensitiveLike(Projections.Cast(NHibernateUtil.String, Projections.Property(pvo.Property)), String.Format("{0}%", pvo.Value), MatchMode.Exact));
break;
default:
throw new ArgumentException("LikeOperator not recognised");
}
}
}
if (sort)
{
foreach (var pair in GridResult.SortList)
{
var func = pair.Value
? new Func<string, NHibernate.Criterion.Order>(NHibernate.Criterion.Order.Asc)
: new Func<string, NHibernate.Criterion.Order>(NHibernate.Criterion.Order.Desc);
query.AddOrder(func(pair.Key));
}
}
return query;
}
が「好き」がたくさんあり、非常に非効率的である「キャスト」でSQLを作成します。コードは次のようになります。私が知っていることを期待する...私はまだNHibernateの専門家ではないので、このジェネリックソリューションをより効率的にするためにコメントをいただければ幸いです。事前に多くの感謝。
クリスチャン
ありがとうPaco - 私はそう思った。私は今のところこれで生きなければならないと思う。 "Equals"ビットを改善したいと思います。 1つのアイデアは、プロパティの型を決定し、値の型が同じであるかどうかをチェックしてから、Restrictions.Eqを使用することです。プロパティのnhibernate/.netタイプを決定する簡単な方法はありますか?ありがとう。 – cs0815
.net reflectionによる? – Paco
上記の汎用コードが与えられた場合、どうすればよいでしょうか?ありがとう。 – cs0815