如果我在发布/订阅架构中有一个消息列表,我认为在底层列表上使用IEnumerable.Where来检索特定消息并信任消息的顺序是合理的吗?
答案 0 :(得分:21)
Enumerable.Where
扩展方法会,但Queryable.Where
扩展方法不会。
Enumerable.Where
必须保留顺序,因为它流式传输结果并且没有缓存(缓存结果中没有逻辑)。
Queryable.Where
将给定的查询转换为基础数据源将理解的内容,并且无法保证所需的顺序。使用关系数据库时,可以轻松地观察到这种效果。添加where
子句可以让数据库选择另一个索引,这可以改变结果的顺序。
答案 1 :(得分:7)
对于Linq to Objects / IEnumerable
这是真的 - 订单将被维护 - 对于IQueryable
提供商而言,它取决于提供商,许多提供商不维护订单。
看起来这个事实(维护顺序)没有在MSDN上记录,所以我认为它是一个实现细节 - 尽管不太可能 - 将来可能会改变。