C# 用于返回具有多个子数组的对象列表的Linq查询

C# 用于返回具有多个子数组的对象列表的Linq查询,c#,.net,linq,C#,.net,Linq,传入列表 var list = new List<Franchise>() { new Franchise() {Id = 10, Name = "Franchise1", Code= "DD1", IsDomestic= 1, ParentCompanyId=1, GroupId=100 }, new Franchise() {Id = 10, Name = "Franchise1", Code= "DD1",

传入列表

    var list = new List<Franchise>()
    {
     new Franchise()
     {Id = 10, Name = "Franchise1", Code= "DD1", IsDomestic= 1, ParentCompanyId=1, GroupId=100 },        
     new Franchise()
     {Id = 10, Name = "Franchise1", Code= "DD1", IsDomestic= 1, ParentCompanyId=2, GroupId=100 },
     new Franchise()
     {Id = 10, Name = "Franchise1", Code= "DD1", IsDomestic= 1, ParentCompanyId=3, GroupId=200 },
     new Franchise()
     {Id = 15, Name = "Franchise5", Code= "FD1", IsDomestic= 0, ParentCompanyId=4, GroupId=300 },
     new Franchise()
     {Id = 15, Name = "Franchise5", Code= "FD1", IsDomestic= 0, ParentCompanyId=3, GroupId=300 },
     new Franchise()
     {Id = 15, Name = "Franchise5", Code= "FD1", IsDomestic= 0, ParentCompanyId=2, GroupId=400 },
   };
输出-阵列中包含ParentCompanyID和GroupID的每个特许经营权一行

    var list = new List<Franchise>()
    {
       new Franchise()
       {Id = 10, Name = "Franchise1", Code= "DD1", IsDomestic= 1, ParentCompanyIds=[1, 2, 3], GroupIds = [100, 200 ]},        
       new Franchise()
       {Id = 15, Name = "Franchise2", Code= "FD1", IsDomestic= 0, ParentCompanyIds=[4, 3, 2], GroupIds = [300, 400] }
    };
var list=新列表()
{
新专营权()
{Id=10,Name=“特许经营1”,Code=“DD1”,IsDomestic=1,ParentCompanyIds=[1,2,3],GroupIds=[100200]},
新专营权()
{Id=15,Name=“特许经营2”,Code=“FD1”,IsDomestic=0,ParentCompanyIds=[4,3,2],GroupIds=[300400]}
};
实现这一点的高效LINQ查询是什么?提前谢谢


您可以尝试以下方法:

var collectionGroup = list.GroupBy(x => new { x.Name, x.Id, x.Code, x.IsDomestic }).ToList();
var result = collectionGroup.Select(x => new FranchiseNew
        {
            Id = x.Key.Id,
            Name = x.Key.Name,
            Code = x.Key.Code,
            IsDomestic = x.Key.IsDomestic,
            CategoryIds = x.GroupBy(s => s.ParentCompanyId).Select(y => y.Key).ToArray(),
            DivisionIds = x.GroupBy(s => s.GroupId).Select(y => y.Key).ToArray()
        }).ToList();

在新模型中,添加代码字段

您不需要通过
.ToList
实现
collectionGroup
。使用
GroupBy
来选择不同的ID是过分的,请使用
.select(s=>s.GroupId).distinct()
感谢sri harsha和Guru Stron。上述解决方案有效。但在我的问题上,当我拥有特许经营权的时候。我没有特许经营类,数据来自数据表。当我尝试在x.GroupBy(s=>s.GroupId)上使用相同的方法时,我得到一个错误“表示一个对象,其操作将在运行时得到解决”。感谢Sri harsha nad Guru Stron。这个解决方案有效。
var collectionGroup = list.GroupBy(x => new { x.Name, x.Id, x.Code, x.IsDomestic }).ToList();
var result = collectionGroup.Select(x => new FranchiseNew
        {
            Id = x.Key.Id,
            Name = x.Key.Name,
            Code = x.Key.Code,
            IsDomestic = x.Key.IsDomestic,
            CategoryIds = x.GroupBy(s => s.ParentCompanyId).Select(y => y.Key).ToArray(),
            DivisionIds = x.GroupBy(s => s.GroupId).Select(y => y.Key).ToArray()
        }).ToList();