所以我有一个非常简单的SQL调用
SELECT count(col1) as count, sum(col2) as charges, col3, col4
FROM table GROUP BY col3, col4
当我进行上述调用时,我返回了4,961行。
当我通过以下linq语句运行结果时,它每次运行时都会以不同的顺序返回数据。
我想我的断开是什么,为什么我会得到不同的结果?不管下面的linq块是什么顺序,它不应该解析相同的数据吗?
IEnumerable<Chart.Point> recs = from a in
(from r in cache.Data
where ids.Contains(r[idColName].ToString())
group r by r[ranColName].ToString() into g
select new Chart.Point { Key = g.Key, Value = g.Sum(x =>
Convert.ToInt64(x[countCol])) }).Take(numberOfColumns)
orderby a.Value descending, a.Key
select a;
答案 0 :(得分:2)
让我们拆分查询以使事情更清晰:
var points =
from r in cache.Data
where ids.Contains(r[idColName].ToString())
group r by r[ranColName].ToString() into g
select new Chart.Point {
Key = g.Key,
Value = g.Sum(x => Convert.ToInt64(x[countCol]))
};
var topPoints = points.Take(numberOfColumns);
var orderedPoints = from a in topPoints
orderby a.Value descending, a.Key
select a;
cache.Data
属性具有任意顺序,因为它是从未指定排序的SQL查询填充的。这意味着topPoints
每次可能会以不同的点数结束。因此,在不同的运行中排序看起来会有所不同(但实际上它是正在排序的点这是不同的,而不是点的排序)
通过在排序操作后移动Take
操作,您应该能够获得一致,有序和有限的点序列,以便在应用限制之前,相同的点始终位于顶部。