保留Linq Contains的默认顺序
本文关键字:默认 顺序 Contains Linq 保留 | 更新日期: 2023-09-27 18:18:41
我想保留来自sql的默认顺序,经过Linq处理后也。我知道以前有人问过这个问题。这里有一个链接Linq Where Contains…保持默认顺序。
但是我仍然不能把它应用到我的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的匿名对象,你可以随意在命令后执行另一个select来创建一个没有Id的新对象。
p。您可能想要更正Attribute的拼写,并且您应该在是否要给属性名加上前缀以及如何这样做方面保持一致。您的表使用attribute (sp?)作为所有内容的前缀,然后当您转到匿名对象时,您将删除除AtributeType
之外的所有属性上的前缀,并使用At
作为前缀。选择一个并坚持使用,选择AtName, AtType, AtOptions或Name, Type, Options