保留 Linq Contains 的默认顺序

Retain default order for Linq Contains

我想保留来自 sql 的默认顺序,经过 Linq also.I 处理后知道这个问题以前有人问过。这里有一个linkLinq 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
                                         })
                            });

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

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 之后随意执行另一个 select 以创建一个没有 ID 的新匿名对象。

PS。您可能想要更正 Attribute 的拼写,如果您要为 属性 名称添加前缀,以及如何添加前缀,您应该保持一致。您的 table 为所有内容添加了 Atribute(sp?) 前缀,然后当您将其转换为匿名对象时,您删除了除 AtributeType 之外的所有属性的前缀,您使用 At 作为前缀].选择一个并坚持下去,选择 AtName、AtType、AtOptions 或名称、类型、选项。