[英]How do I perform a linq GroupBy across 3+ columns
我从以下列表开始
List items = new List();
items.add(new Vehicle { MakeID = 1, MakeName = "Oldsmobile", ModelID = 2, ModelName = "98 Regency" });
items.add(new Vehicle { MakeID = 1, MakeName = "Oldsmobile", ModelID = 3, ModelName = "88 Delta" });
items.add(new Vehicle { MakeID = 1, MakeName = "Oldsmobile", ModelID = 4, ModelName = "Alero" });
items.add(new Vehicle { MakeID = 1, MakeName = "Oldsmobile", ModelID = 5, ModelName = "442" });
items.add(new Vehicle { MakeID = 2, MakeName = "Buick", ModelID = 11, ModelName = "Skylark" });
items.add(new Vehicle { MakeID = 2, MakeName = "Buick", ModelID = 13, ModelName = "Electra 225" });
items.add(new Vehicle { MakeID = 2, MakeName = "Buick", ModelID = 14, ModelName = "Regal" });
items.add(new Vehicle { MakeID = 2, MakeName = "Buick", ModelID = 16, ModelName = "Enclave" });
但是希望它转换为以下格式:
List newList = new List();
items.add(new VehicleWithModelList { MakeID = 1, MakeName = "Oldsmobile", new List<Model> () { This list would contain the 4 oldsmobile models from above}});
items.add(new VehicleWithModelList { MakeID = 2, MakeName = "Buick", new List<Model> () { This list would contain the 4 buick models from above}});
public class Model {
public int ModelID { get; set; }
public string ModelName { get; set; }
}
我有以下linq到对象查询,但我不断收到语法错误,说它在最后一个右括号之前需要一个分号。
var newList = items.GroupBy(x => new {x.MakeID, x.ModelID, x.MakeName, x.ModelName}, (key, group) => new { MakeID = key.MakeID, MakeName = key.MakeName, ModelList = group.Select(z => new Model { ModelID = z.ModelID, ModelName = z.ModelName })).Cast< VehicleWithModelList >();
实现这一目标的正确方法是什么?
您在下面标记的位置错过了大括号:
var newList = items.GroupBy(x => new
{
x.MakeID,
x.ModelID,
x.MakeName,
x.ModelName
},
(key, group) => new
{
MakeID = key.MakeID,
MakeName = key.MakeName,
ModelList = group.Select(z => new Model
{
ModelID = z.ModelID,
ModelName = z.ModelName
})
} // <---- Here
).Cast<VehicleWithModelList>();
您只想通过MakeId和MakeName进行分组,否则您将为每个唯一的ModelId和ModelName获得不同的分组(它似乎不是您查询的目标:
var newList = items.GroupBy(x => new { x.MakeId, x.MakeName });
您也可以通过直接选择VehicleWithModelList
对象来丢失Cast:
(key, group) => new VehicleWithModelList
{
MakeID = key.MakeID
... etc
怎么样的:
items.GroupBy(x => new { x.MakeID }).Select(x => new VehicleWithModelList
{
MakeID = x.First().MakeID,
MakeName = x.First().MakeName
Models = x.Select(x => new Model
{
ModelID = x.ModelID,
ModelName = x.ModelName
}).ToList()
});
但是如果你给我们Model
的类定义会有所帮助
看起来不需要按MakeID和MakeName分组 - MakeID应该足够了,除非由于某种原因可以使用不同的MakeName的MakeID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.