3

アイテムのステータスとアイテムを表すオブジェクトを記述する次の列挙型があります。

public Enum Status
{
    Sent,
    Received,
    UnderWork,
    Returned
}

public Class Item
{
    public virtual int Id {get;set;}
    public virtual Status CurrentStatus {get;set;}
    public virtual string ItemDescription {get;set;}
    public virtual int ItemNumber {get;set;}
    public virtual DateTime DueDate {get;set;}
}

多数のアイテムを選択し、最初に CurrentStatus プロパティで並べ替え、次に DueDate プロパティで並べ替えることができるクエリを作成する必要があります。問題は、返品ステータスのすべてのアイテムを最後に置いて、DueDate で注文し、他のすべてのアイテムを DueDate でのみ注文し、CurrentStatus を無視して、CurrentStatus で注文したいことです。

したがって、次のデータのリスト:

ID | CurrentStatus | ItemDescription | ItemNumber | DueDate
-------------------------------------------------------------
1  | Returned      |  Description1   |  123456    | 16/01/2012
2  | Sent          |  Description2   |  234567    | 13/01/2012
3  | Returned      |  Description3   |  345678    | 22/01/2012
4  | Received      |  Description4   |  456789    | 03/01/2012
5  | UnderWork     |  Description5   |  567891    | 10/01/2012
6  | UnderWork     |  Description6   |  678901    | 17/01/2012
7  | Sent          |  Description7   |  789012    | 09/01/2012
8  | Sent          |  Description8   |  890123    | 28/01/2012
9  | Returned      |  Description9   |  901234    | 30/01/2012
10 | Received      |  Description10  |  012345    | 15/01/2012

次の Linq to NHibernate のようなものを使用して照会されます (これにより QuerySyntaxException: Exception of type 'Antlr.Runtime.NoViableAltException' がスローされました) がスローされます)。

var workList = session.Query<Item>()
                .OrderBy(item => item.Status == Status.Returned)
                .ThenBy(item  => item.DueDate)
                .ToList();

そして、次の順序でデータのリストを取得することを期待しています:

ID | CurrentStatus | ItemDescription | ItemNumber | DueDate
-------------------------------------------------------------
4  | Received      |  Description4   |  456789    | 03/01/2012
7  | Sent          |  Description7   |  789012    | 09/01/2012
5  | UnderWork     |  Description5   |  567891    | 10/01/2012
2  | Sent          |  Description2   |  234567    | 13/01/2012
10 | Received      |  Description10  |  012345    | 15/01/2012
6  | UnderWork     |  Description6   |  678901    | 17/01/2012
8  | Sent          |  Description8   |  890123    | 28/01/2012
1  | Returned      |  Description1   |  123456    | 16/01/2012
3  | Returned      |  Description3   |  345678    | 22/01/2012
9  | Returned      |  Description9   |  901234    | 30/01/2012

Linq to NHibernate を使用してこれを行うことはできますか? その場合、クエリにどのような変更を加える必要がありますか? また、SKip() と Take() を期待するので、DB からすべてをプルすることはできません。SQL Server 2008 Express、NHibernate 3.3.0.4000、および Fluent Nhibernate 1.3.0.727 を使用しています。

編集

並べ替えをどのように行うかについて詳しく説明します。ステータスが返されたアイテムをリストの一番下にプッシュして、期日順に並べ替えたいと思います。他のすべてのアイテムをステータスではなく、期日だけでソートしたいので、返品されたアイテムよりも常に優先されます。これは、返されたものが作業プロセスに含まれなくなったため、リストの最後にプッシュしたいためです。したがって、この場合、返される以外のステータス値は関係ありません。

4

2 に答える 2

4

これは私にとってはうまくいきました。NHibernate がステータスを処理し、SQLcaseステートメントを生成する方法がより明確になります。

var workList = session.Query<Item>()
    .OrderBy(item => item.CurrentStatus == Status.Returned ? 1 : 0)
    .ThenBy(item => item.DueDate)
    .ToList();
于 2012-05-31T09:53:38.313 に答える