【问题标题】:linqtosql maintain ordering of listlinqtosql 维护列表的顺序
【发布时间】:2015-12-04 13:51:50
【问题描述】:
var convertedIds = ids.Select(id => Convert.ToInt32(id)).ToList();
return this.context.SupportedCharacterSets
    .Where(av => converteIds.Contains(av.id))
    .Select(av => new AsideItem 
                  { 
                     Id = av.id.ToString(CultureInfo.InvariantCulture), 
                     Name = av.name 
                  }).ToList();

convertedIds 是一个整数列表:{ 2, 1 } - 例如

当我从数据库中选择时,它命令它1,2(这是预期的),有没有办法不这样做?我看到你可以做一个Dictionary 对象,但不确定这是否矫枉过正?

【问题讨论】:

  • 你混淆了不同的东西。 LINQ to EF 或 SQL 实际上会生成一条 SQL 语句。在您的情况下,它是带有 IN (1,2,...) 子句的语句。不能保证结果会以任何顺序返回。即使在 LINQ to Object 中,Where 也不会影响顺序。 whatwhere 的条件并不重要。
  • 我知道它会生成 SQL,我的问题不在于它生成什么,而是是否有另一种方法可以通过 convertIds 进行排序,而不是将 convertIds 添加到 Dictionary 对象中,这就是我在网上看过。我也知道 WHERE 和 ORDER BY 非常不同,问题不在于 WHERE 子句,而在于我如何订购

标签: c# linq contain


【解决方案1】:

您可以在OrderBy 中使用List.IndexOf

return this.context.SupportedCharacterSets
    .Where(av => converteIds.Contains(av.id))
    .AsEnumerable()  // to get  Linq-To-Objects
    .OrderBy(av => converteIds.IndexOf(av.id))
    .Select(av => new AsideItem 
    { 
       Id = av.id.ToString(CultureInfo.InvariantCulture), 
       Name = av.name 
    })
    .ToList();

【讨论】:

  • 我怀疑这在 LINQ to EF 中是否有效,并且在 LINQ to SQL 中会产生意想不到的副作用。 OP提到代码从数据库中选择
  • 谢谢,蒂姆,你今天很高兴 :-D,当我可以的时候我会接受答案
  • @PanagiotisKanavos:这就是我在Where 之后使用AsEnumerable 的原因。支持Contains,但不支持IndexOf,因此您需要将匹配的行加载到内存中。
猜你喜欢
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多