保留 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 或名称、类型、选项。
我想保留来自 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 或名称、类型、选项。