Linq输出变化

时间:2013-12-09 18:10:11

标签: c# sql linq

所以我有一个非常简单的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;

1 个答案:

答案 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操作,您应该能够获得一致,有序和有限的点序列,以便在应用限制之前,相同的点始终位于顶部。