8

古いスタイルのクエリCreateCriteria()を にリファクタリングしていますQueryOver()。私の Wcf サービスはstring PropertyName、クエリの結果を並べ替えることができます。IQueryable私はDynamic LINQを使用してそのような順序付けを行いCreateCriteria()ますAddOrder()

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: LINQ to Nhibernate を使用できませんでした: LINQ to NHibernate - .GroupBy().Skip().Take() は例外を引き起こします

ありがとう!

4

2 に答える 2

15

あなたはいつでも手に入れることができます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();

または 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;
}
于 2012-08-13T14:47:04.270 に答える
1

を渡すことで、QueryOver API から直接 OrderBy を設定できますProjections.Property(propName)。次に例を示します。

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

文字列で方向を設定する方法はないため、単純な if/else を実行するか、拡張メソッドを作成して API を簡素化する必要があります。

于 2013-01-23T06:01:22.423 に答える