2017-06-21 65 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有時但不總是,變成問題順序後到前,而不會反轉答案或questionID,從而將其拋出。 即如果該集合是questionID 1,2,3並且問題A,B,C有時返回1,2,3和C,B,A

任何人都可以建議爲什麼它可能會這樣做?爲什麼只在一列上?謝謝!

編輯:明白了,謝謝大家!在情況下,它有助於在未來的人,這裏是用來解決方案:

 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

提供者是實體。我知道它並沒有推斷出一個訂單,但並不認爲這是重要的,因爲我認爲它會以相同的相對順序。 – David

回答

1

一個分組順序的逆轉是一個巧合:IQueryable<T>GroupBy回報集團在沒有特定的順序。不像在存儲器GroupBy,其指定其組的順序,在RDBMS執行的查詢取決於實現:

因執行該表示調用GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>)表達式樹的結果的查詢行爲取決於實施源參數的類型。'

如果您希望將行按特定順序排列,則需要將OrderBy添加到您的查詢中以強制執行。

我該怎麼做,並維護相對列表順序,而不是將結果應用於結果集?

一種方法是在將數據帶入內存後對其應用分組。最後將ToList()應用於dataSet以將數據帶入內存。之後,後續GrouBy查詢的順序將與dataSet一致。缺點是分組不再在RDBMS中完成。

+0

謝謝,但我想知道我是如何做到這一點,並維護相關列表順序,而不是將結果應用於結果集。從本質上講,當我返回對象時,只要三個內部列表的順序保持一致,返回的結果集的順序就是不相關的。 – David

+0

@David請參閱建議修復訂單的一種方法的編輯。 – dasblinkenlight

+0

謝謝你,我用稍微不同的方法修正了它,就像在我的問題編輯中一樣,但這是一個非常有用的知識。 – David