保留Linq Contains的默认订单

时间:2015-10-22 03:02:51

标签: c# linq contains

我想在Linq处理之后保留sql的默认顺序。我知道之前已经问过这个问题。这是一个链接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
                                         })
                            });

1 个答案:

答案 0 :(得分:2)

你的假设是错误的。 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。您可能想要更正属性的拼写,如果要为属性名称添加前缀,以及如何执行此操作,则应该保持一致。您的表格使用Atribute(sp?)作为前缀,然后当您进入并强制转换为匿名对象时,删除除AtributeType之外的所有属性的前缀,前缀为At。选择一个并坚持下去,选择AtName,AtType,AtOptions或Name,Type,Options。