我有一个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)
};
答案 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中完成分组。