我想在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
})
});
答案 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。