2013-01-08 14 views
7

Chcę zwrócić listę pewnej encji pogrupowanej według określonej właściwości, uporządkowanej malejąco według znacznika czasu i paginacji (przy użyciu Pomiń i wziń). Co mam to:Pisząc zapytanie linq, które używa OrderBy

container.CoinMessageSet.Where(
       c => c.MessageState != MessageStateType.Closed && 
        (c.DonorOperator.OperatorCode.Equals("opcode") || 
         c.RecipientOperator.OperatorCode.Equals("opcode")) 
       ).OrderByDescending(c => c.TimeStamp) 
       .GroupBy(c => c.Reference).Skip(x).Take(100); 

Po wykonaniu Dostałem wyjątek:

The method 'Skip' is only supported for sorted input in LINQ to Entities. 
The method 'OrderBy' must be called before the method 'Skip'. 

... nazwałem orderby() (aczkolwiek malejąco) i nazwałem go przed Przejdź()! czego mi brakuje?

Odpowiedz

7

Nie zamówiłeś grup; musisz to zrobić, zanim będziesz mógł strona. Na przykład:

.GroupBy(c => c.Reference).OrderBy(grp => grp.Key).Skip(x).Take(100); 

(można również zastąpić OrderByDescending jeśli chcesz grup w odwrotnej kolejności)

również: ponieważ jesteś grupowania, kolejność w oryginalnych danych jest w dużej mierze bez znaczenia; prawdopodobnie możesz usunąć OrderByDescending(c => c.TimeStamp).

Więc wynik netto:

var query = container.CoinMessageSet.Where(
      c => c.MessageState != MessageStateType.Closed && 
       (c.DonorOperator.OperatorCode.Equals("opcode") || 
        c.RecipientOperator.OperatorCode.Equals("opcode")) 
      ).GroupBy(c => c.Reference).OrderBy(grp => grp.Key) 
      .Skip(x).Take(100); 

lub ewentualnie:

var query = (from c in container.CoinMessageSet 
      where c.MessageState != MessageStateType.Closed && 
        (c.DonorOperator.OperatorCode == "opcode" || 
        c.RecipientOperator.OperatorCode == "opcode") 
      group c by c.Reference into grp 
      orderby grp.Key 
      select grp).Skip(x).Take(100); 
+0

Dzięki za wyjaśnienie na oryginalnym wydaniu, a zdając sobie sprawę, mam nowy) (czyli „muszę zamówić według datownika, ale jest to w dużej mierze bezużyteczne ze względu na Grupuj według) –

2

Jest to najprawdopodobniej ze względu na GroupBy po OrderByDescending.

Myślę, że można spróbować:

container.CoinMessageSet.Where(
       c => c.MessageState != MessageStateType.Closed && 
        (c.DonorOperator.OperatorCode.Equals("opcode") || 
         c.RecipientOperator.OperatorCode.Equals("opcode")) 
       ).OrderByDescending(c => c.TimeStamp) 
       .GroupBy(c => c.Reference).OrderByDescending(c = > c.Key).Skip(x).Take(100);