2

次のような構造を持つ高度なチケット オブジェクトのリストがあります。

AdvancedTicket
-Id
-BasicTicket
-CreatedDate

BasicTicket
-Id

そして、高度なチケット テーブルにクエリを実行すると、次のようになります。

1, BasicTicketId1, 10/11/12
2, BasicTicketId2, 10/11/12
3, BasicTicketId1, 10/12/13

...

「すべての AdvancedTickets を教えてください。ただし、前売りチケットごとに最新のもののみを表示します」と言うことができるようにしたいと考えています。

機能しない次のコードがあります。

from item in allAdvancedTickets
group item by item.BasicTicket.Id
into basicTicket
let d = basicTicket.OrderByDescending(c => c.CreatedDate)
orderby d descending
select basicTicket;

少なくとも 1 つの項目で iComparable を実装する必要があるというエラーが表示されます。

そもそもこのクエリは間違っていると思いますが、linq でこの関数を使用したことがないので、助けていただければ幸いです。

4

1 に答える 1

2

最初にアイテムを並べ替えCreatedDate、グループ化してから、各グループの最初のアイテムを選択する必要があります。以前に並べ替えたので、そのアイテムが最新のアイテムになります。

そのシーケンスは、次のクエリを生成します。

var query = from item in allAdvancedTickets
            orderby item.CreatedDate descending
            group item by item.BasicTicket.Id
            into basicTickets
            select basicTickets.First();

コメントによると、NHibernate を使用している場合、グループ化に関してバグがあります。次の方法で 2 つのクエリを使用することで、回避できる場合があります。

var idDateQuery = from item in _session.GetAllAdvacnedTickets()
                  orderby item.BasicTicket.Id, item.CreatedDate descending
                  select item;

var query = from item in _session.GetAllAdvacnedTickets()
            let top = idDateQuery.First(o => o.BasicTicket.Id == item.BasicTicket.Id)
            where item.Id == top.Id
            select item;

NHibernate に対してこれをテストしていないことに注意してください。この回避策が不可能な場合は、代わりに SQL レベルに落とす必要があるかもしれません。

于 2013-10-12T00:20:00.877 に答える