2017-06-21 7 views
1

により、グループ内の順序を逆にLINQは、私は、以前のクエリのいくつかの行にいくつかの一つの列を逆にしているようだLINQクエリを持っている:はなぜ

 var dataSet = from fb in ds.Feedback_Answers 
         where fb.Feedback_Questions.Feedback_Questionnaires.QuestionnaireID == criteriaType 
          && fb.UpdatedDate >= dateFeedbackFrom && fb.UpdatedDate <= dateFeedbackTo 
         select new 
         { 
          fb.Feedback_Questions.Feedback_Questionnaires.QuestionnaireID, 
          fb.QuestionID, 
          fb.Feedback_Questions.Text, 
          fb.Answer, 
          fb.UpdatedBy 
         }; 

は、最初のデータセットを取得し、作業を確認しました。 これは、このように分類されます。グループ化

var groupedSet = from row in dataSet 
         group row by row.UpdatedBy 
          into grp 
          select new 
          { 
           Survey = grp.Key, 
           QuestionID = grp.Select(i => i.QuestionID), 
           Question = grp.Select(q => q.Text), 
           Answer = grp.Select(a => a.Answer) 
          }; 

が、(タイプ:文字列、リストint型、リスト列、リストint型)を得られたreturnsetは時々、常にではないが、後ろから前に質問の順番をオン、 answerまたはquestionIDを反転させずに、それをスローします。 つまり、questionID 1,2,3と質問A、B、Cの場合は、1,2,3、C、B、Aを返すことがあります。

なぜこのようなことが起こるかもしれないのですか?なぜ1つの列にしかないのですか?ありがとう!

編集:ありがとうございました!場合には、それが将来的に誰を助け、ここで使用されるソリューションは、次のとおりです。グループ化されたオーダーの

 var groupedSet = from row in dataSet 
         group row by row.UpdatedBy 
          into grp 
          select new 
          { 
           Survey = grp.Key, 
           QuestionID = grp.OrderBy(x=>x.QuestionID).Select(i => i.QuestionID), 
           Question = grp.OrderBy(x=>x.QuestionID).Select(q => q.Text), 
           Answer = grp.OrderBy(x=>x.QuestionID).Select(a => a.Answer) 
          }; 
+2

特定の順序でデータが必要な場合は、最後のクエリで 'OrderBy'を使用してください。 – mjwills

+3

LINQプロバイダについても言及していません。 Linq-To-Objectでは、注文は保存されます。データベース駆動型プロバイダの場合、データベースによって注文が決定されます。順序を指定していないので、表には固有の順序がないため、任意の順序で自由に戻すことができます。 –

+0

プロバイダはエンティティへのlinqです。私はそれが命令を推論しなかったことを知っていましたが、それが同じ相対的な順序であると思っていたとしてそれが重要であるとは思わなかった。 – David

答えて

1

逆転は偶然の一致である:IQueryable<T>年代順不同でグループを返しますGroupBy。そのグループの順序を指定する、メモリ内GroupBy異なり、RDBMSで行うクエリは実装に依存:

GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>)を呼び出す表す式ツリーを実行した結果として発生するクエリ動作は、実装に依存しますソースパラメータのタイプ。

特定の順序でローを使用したい場合は、クエリにOrderByを追加する必要があります。

結果のセットにオーダーを適用するのではなく、相対リストの順序を維持する方法を教えてください。

1つのアプローチは、データをメモリに保存した後にデータに適用することです。最後にToList()dataSetを入力してデータをメモリに読み込みます。その後、次のGrouByクエリの順序はdataSetと一致します。欠点は、RDBMSではグループ化がもう行われないということです。

+0

ありがとうございます、しかし、私はどのようにそれを行うと、相対的なリストの順序を維持するのではなく、結果のセットに注文を適用するのだろうか。基本的に、私がオブジェクトを返すとき、返される結果セットの順序は、3つの内部リストの順序が一致している限り、無関係です。 – David

+0

@David注文を修正する方法の1つを示唆する編集をご覧ください。 – dasblinkenlight

+0

ありがとうございました、私の質問の編集と同じように、少し異なる方法で修正しましたが、それは知ることは本当に便利です。 – David