2012-08-13 12 views
6

古いスタイルのクエリCreateCriteria()QueryOver()にリファクタリングしています。私のWcfサービスは問い合わせ結果を注文するのにstring PropertyNameを得ます。 IQueryableの場合、私はCreateCriteria() - AddOrder()のように、そのような順序を行うためにダイナミックLINQを使用します。Nhibernate QueryOver。文字列プロパティ名を使用したOrderBy。

IList<object[]> result = 
      GetSession() 
       .QueryOver(() => activity) 
       .JoinAlias(() => activity.ActivityLicense,() => license) 
       .Select(Projections.ProjectionList() 
          .Add(Projections.Count<Activity>(e => e.Id), "ActivityCount") 
          .Add(Projections.Group(() => license.SerialNumber), "SerialNumber") 
          .Add(Projections.Count<Activity>(e => e.MacAdress), "MacAddressCount") 
          .Add(Projections.Count<Activity>(e => e.IpAdress), "IpAddressCount") 
       ) 
       .OrderByAlias("ActivityCount") // Compilation Error - I need such extension method 
       .List<object[]>(); 

文字列のプロパティ名の場合にどのように注文するのですか?

PS:私はNHibernateのにLINQを使うことができませんでした:LINQ to NHibernate - .GroupBy().Skip().Take() cause an exception

感謝を!

答えて

12

あなたはいつもUnderlyingCriteria ...

var q = GetSession() 
       .QueryOver(() => activity) 
       .JoinAlias(() => activity.ActivityLicense,() => license) 
       .Select(Projections.ProjectionList() 
          .Add(Projections.Count<Activity>(e => e.Id), "ActivityCount") 
          .Add(Projections.Group(() => license.SerialNumber), "SerialNumber") 
          .Add(Projections.Count<Activity>(e => e.MacAdress), "MacAddressCount") 
          .Add(Projections.Count<Activity>(e => e.IpAdress), "IpAddressCount") 
       ); 


q.UnderlyingCriteria.AddOrder(new Order("ActivityCount", true)); 

var results = q.List(); 

またはあなたがのために、Projections.Property(propName)に渡すことによってQueryOverのAPIから直接[並べ替えを設定することができますIQueryOver

public static IQueryOver<T,T> OrderByAlias(this IQueryOver<T,T> q, string aliasName, bool ascending) 
{ 
    q.UnderlyingCriteria.AddOrder(new Order(aliasName, ascending)); 
    return q; 
} 
+0

ありがとうございました。 ICriteriaをIQueryOverに戻すことは可能ですか? –

+0

私はそうは思わない、あなたができることはIQueryOver拡張メソッドにリファクタリングすることです。私は例を投稿します... – dotjoe

0

ための拡張メソッドとしてを得ることができます例:

var query = GetSession() 
       .QueryOver<Activity>() 
       .OrderBy(Projections.Property("ActivityCount").Desc; 

方向を文字列で指定するので、単純なif/elseを実行するか、拡張メソッドを作成してAPIを単純化する必要があります。

+0

.Descプロパティは存在しません –

関連する問題