2011-08-16 14 views
0

列にAppleType、CreationDateがあり、CreationDateによってAppleTypeの各グループを注文したいとします。さらに、AppleTypeごとにCreationDateの順序を明示的にランク付けする新しい列を作成したいとします。LINQでorderbyの後にグループごとの行に番号を付ける

したがって、結果のDataSetには、AppleType、CreationDate、OrderIntroducedの3つの列があります。

LINQの方法はありますか?実際にデータをプログラムで(LINQ経由ではなく)処理し、配列を作成し、列に変換してDataSetに追加する必要がありますか?私はこれを行うLINQの方法があります。可能であれば、LINQ非メソッド構文を使用してください。

答えて

3

実際に値が実際に正しい順序で表示されていますか?

var queryWithIndex = queryWithoutIndex.Select((x, index) => new 
               { 
                x.AppleType, 
                x.CreationDate, 
                OrderIntroduced = index + 1, 
               }); 

(それはあなたが1から始まるOrderIntroducedをしたいと仮定しています):クエリ式の構文は、関連する過負荷をサポートしていないとして、メソッドの構文を使用する必要がありますが、を行う- もしそうなら、それは簡単です

私はそれをどのようにDataSetに入れたのかわかりませんが、実際にはである必要があります。強く型付けされたシーケンスではなく、DataSetです。

EDIT:さて、要件はまだ不明ですが、私はあなたが何かしたい考える

var query = dataSource.GroupBy(x => x.AppleType) 
    .SelectMany(g => g.OrderBy(x => x.CreationDate) 
         .Select((x, index) => new { 
           x.AppleType, 
           x.CreationDate, 
           OrderIntroduced = index + 1 })); 

注:ここGroupBySelectMany呼び出しは、クエリ式の構文でを置くことができますが、私はそれがこのケースでそれがもっと乱雑になると信じています。両方の形式で快適になる価値があります。あなたはエンティティ/ SQL溶液に純粋のLINQをしたい場合は

+0

はよさそうだが、私は、単にインデックスをそれぞれたくありませんApplyTypeとCreationDateを基準にして各行にインデックスを付ける必要があります。つまり、新しいAppleTypeはそれぞれインデックス1から始まります。 –

+0

@Ben:「AppleType」でグループ分けした後、平らにする前に追加してください。あなたがサンプルクエリを提供していないときに、あなたが望むものを正確に推測することは非常に難しいですが、私はそれに行くでしょう。 –

+0

作品。ありがとう!クエリ構文でAggregateを使用するとどうなりますか? –

1

あなたはこのような何かを行うことができます。

は、複製処理するように変更のCreationDateの

var query = from a in context.AppleGroup 
      orderby a.CreationDate 
      select new 
      { 
       AppleType = a.AppleType, 
       CreationDate = a.CreationDate, 
       OrderIntroduced = (from b in context.AppleGroup 
           where b.CreationDate < a.CreationDate 
           select b).Count() + 1 
      }; 
+0

Countはインデックスではありません。これが本当に私が必要とすることをしますか? –

+0

@Ben B - 重複したCreationDatesを処理するための回答を更新しました。基本的にインデックスであるすべてのレコードを数えているので動作します – Aducci

関連する問題