【问题标题】:Retain default order for Linq Contains保留 Linq 包含的默认顺序
【发布时间】:2015-10-23 04:32:23
【问题描述】:

我想保留来自 sql 的默认顺序,在 Linq 处理之后。我知道这个问题以前被问过。这是一个链接Linq Where Contains ... Keep default order。

但我仍然无法将它正确应用于我的 linq 查询。有人可以帮我吗?谢谢!

这里是查询

var x = db.ItemTemplates.Where(a => a.MainGroupId == mnId)
                        .Where(a => a.SubGruopId == sbId)
                        .FirstOrDefault();
var ids = new List<int> { x.Atribute1, x.Atribute2, x.Atribute3, x.Atribute4 };
var y = db.Atributes.Where(a => ids.Contains(a.AtributeId))
                    .Select(g => new
                            {
                               Name = g.AtributeName,
                               AtType = g.AtributeType,
                               Options = g.atributeDetails
                                   .Where(w=>w.AtributeDetailId!=null)
                                   .Select(z => new 
                                         {
                                            Value=z.AtributeDetailId,
                                            Text=z.AtDetailVal
                                         })
                            });

【问题讨论】:

  • 你能准确解释一下排序出错的地方吗?
  • @Enigmativity,假设 Atribute1 表示“ben”,Atribute2 表示“attr5”,Atribute3 表示“ian”。但是在处理后 y 给出了这个命令“ian”、“ben”、“attr5”。我不知道这是根据什么排序的。但我想要以初始方式的序列。那是“ben”、“attr5”、“ian”。请帮忙..
  • 您确实意识到,如果您不使用 ORDER BY,您的数据库很可能也不保证任何记录顺序?
  • @nvoigt,不,我没有根据订单在数据库中存储记录,并且根据上述查询,它从数据库中获取记录,就像它在数据库中一样。我检查了它。但在通过 linq 处理后,它会改变序列..
  • @Isuru - 我想知道排序出了什么问题。 db.Atributes之后是不是错了?在.Where(a =&gt; ids.Contains(a.AtributeId)) 之后?在.Select(...)之后?

标签: c# linq contains


【解决方案1】:

你的假设是错误的。 SQL Server 是按照您获取结果的顺序发回结果的服务器。但是,您可以解决这个问题:

var x = db.ItemTemplates.Where(a => a.MainGroupId == mnId)
                        .Where(a => a.SubGruopId == sbId)
                        .FirstOrDefault();
var ids = new List<int> { x.Atribute1, x.Atribute2, x.Atribute3, x.Atribute4 };
var y = db.Atributes.Where(a => ids.Contains(a.AtributeId))
                    .Select(g => new
                            {  
                               Id = g.AtributeId,
                               Name = g.AtributeName,
                               AtType = g.AtributeType,
                               Options = g.atributeDetails
                                   .Where(w=>w.AtributeDetailId!=null)
                                   .Select(z => new 
                                         {
                                            Value=z.AtributeDetailId,
                                            Text=z.AtDetailVal
                                         })
                            })
     .ToList()
     .OrderBy(z=>ids.IndexOf(z.Id));

如果您绝对需要它不包含 id,请随意在 orderby 之后进行另一次选择以创建一个没有 Id 的新匿名对象。

PS。您可能想要更正 Attribute 的拼写,如果要为属性名称添加前缀,以及如何操作,您应该保持一致。你的表用属性(sp?)作为前缀,然后当你去转换到你的匿名对象时,你删除了除AtributeType之外的所有属性的前缀,你用At作为前缀。选择一个并坚持下去,选择 AtName、AtType、AtOptions 或 Name、Type、Options。

【讨论】:

  • 非常感谢您提供详细解释的答案。是的,有效!
猜你喜欢
  • 2012-01-29
  • 2020-01-25
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
相关资源
最近更新 更多