Linq按降序升序排序

时间:2015-08-08 22:29:48

标签: c# mysql sorting linq-to-entities

对不起标题,但我不知道怎么写得更好。我会尝试发帖。

当我尝试使用linq从数据库中获取值时,会发生奇怪的事情。让我们看看4个查询:

//1
var badAsc = new ConcurrentBag<int>((from x in se.produkts orderby x.numerProduktu select x.numerProduktu));
//2                        
var bagDesc = new ConcurrentBag<int>((from x in se.produkts orderby x.numerProduktu descending select x.numerProduktu));
//3
var listAsc = (from x in se.produkts orderby x.numerProduktu select x.numerProduktu).ToList();
//4
var listdesc = (from x in se.produkts orderby x.numerProduktu descending select x.numerProduktu).ToList();

我们得到了2 ConcurrentBags<int>和2 List<int>。我期待的是1和3将是相同的,2和4将是相同的。检查我得到了什么值:

linq queries

ConcurrentBag<int>的升序排序实际上在下降。在Microsoft网站上我们可以看到,ConcurrentBag在排序无关紧要时很好,但正如我们在bagDesc中看到的那样,保留了排序。为了表明我在数据库中没有任何奇怪的东西,我还会制作两个List<int>,其中排序保持不变。

在我的数据库中执行select * from produkt会为我提供类似listAscbagDesc的值。

数据库为mssql 2014numerProduktu是此表中的主键。

有人知道那里发生了什么吗?

1 个答案:

答案 0 :(得分:2)

请参阅here

  

ConcurrentBag似乎是作为堆栈而不是a实现的   队列。也就是说,添加的最后一项是删除的第一项。一世   但不会指望这一点。

所以它们会以相反的顺序添加。但是,顺序并不意味着在ConcurrentBag中可靠地保持一致,因此不能保证总是以这种方式表现,特别是如果由多个线程访问。

如果您关心维持原始的输入顺序,那么您可能需要ConcurrentQueue