为什么linq在

时间:2017-06-21 11:23:35

标签: c# 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)
                             };

在分组时,生成的返回集(类型为:string,list int,list string,list int)有时(但不总是)将问题顺序转回到前面,而不会反转answer或questionID,这会将其抛出。 即如果该集合是问题ID 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)
                             };

1 个答案:

答案 0 :(得分:1)

撤销分组订单是巧合:IQueryable<T>的{​​{1}}按特定顺序返回组。与内存中GroupBy(指定其组的顺序)不同,在RDBMS中执行的查询取决于实现:

  

执行表示调用GroupBy的表达式树时发生的查询行为取决于源参数类型的实现。

如果您希望按特定顺序排定行,则需要在查询中添加GroupBy<TSource,TKey,TElement>(IQueryable<TSource>, Expression<Func<TSource,TKey>>, Expression<Func<TSource,TElement>>)以强制它。

  

我是如何做的并维护相对列表顺序,而不是将订单应用于结果集?

一种方法是在将数据放入内存后对数据应用分组。最后将OrderBy应用于ToList()以将数据存入内存。之后,后续dataSet查询的顺序将与GrouBy一致。缺点是不再在RDBMS中完成分组。