Я работал над общим решением для фильтрации данных с помощью Nhibernate.Код выглядит так:
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, поэтому буду признателен за любые комментарии, чтобы сделать это общее решение более эффективным.Большое спасибо заранее.
Кристиан