对不起标题,但我不知道怎么写得更好。我会尝试发帖。
当我尝试使用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将是相同的。检查我得到了什么值:
ConcurrentBag<int>
的升序排序实际上在下降。在Microsoft网站上我们可以看到,ConcurrentBag
在排序无关紧要时很好,但正如我们在bagDesc
中看到的那样,保留了排序。为了表明我在数据库中没有任何奇怪的东西,我还会制作两个List<int>
,其中排序保持不变。
在我的数据库中执行select * from produkt
会为我提供类似listAsc
和bagDesc
的值。
数据库为mssql 2014
,numerProduktu
是此表中的主键。
有人知道那里发生了什么吗?
答案 0 :(得分:2)
请参阅here。
ConcurrentBag似乎是作为堆栈而不是a实现的 队列。也就是说,添加的最后一项是删除的第一项。一世 但不会指望这一点。
所以它们会以相反的顺序添加。但是,顺序并不意味着在ConcurrentBag
中可靠地保持一致,因此不能保证总是以这种方式表现,特别是如果由多个线程访问。
如果您关心维持原始的输入顺序,那么您可能需要ConcurrentQueue
。