Ich habe an einer generischen Lösung gearbeitet, um Daten mit Nhibernate zu filtern. Der Code sieht wie folgt aus:generische Datengitter Filterung
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;
}
Unfortunatley dies schafft SQL mit viel ‚mag‘ und ‚wirft‘, was sehr ineffizient ist. Zu erwarten, dass ich weiß ... Ich bin noch kein NHibernate-Experte und würde mich über Kommentare freuen, die diese generische Lösung effizienter machen. Vielen Dank im Voraus.
Christian
Danke Paco - ich dachte schon. Ich denke, ich werde jetzt damit leben müssen. Ich möchte das Bit "Gleich" verbessern. Eine Idee besteht darin, den Typ der Eigenschaft zu bestimmen und zu überprüfen, ob der Typ des Werts derselbe ist, und dann zu verwenden: Restrictions.Eq. Gibt es eine einfache Möglichkeit, den nhibernate/.net-Typ einer Eigenschaft zu bestimmen? Vielen Dank. – cs0815
Durch .net Reflexion? – Paco
Angesichts der oben genannten generischen Code - wie würden Sie das tun? Vielen Dank. – cs0815