繁体   English   中英

列表的子列表中的C#linq构建表

[英]C# linq build table from sub list of list

在linq查询的结果中,我想获取应该包含以下内容的List<Record> records

Id=1, Number=1,Weight=23,Street="Testing street"

Id=1, Number=1,Weight=23,Street="Testing street"

Id=1, Number=1,Weight=23,Street="Testing street"

Id=1, Number=1,Weight=23,Street="Testing street"

Id=1, Number=1,Weight=23,Street="Testing street"

Id=1, Number=1,Weight=23,Street="Testing street"

码:

namespace ConsoleApplication24
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Train> Depos = new List<Train>();
            Train train = new Train();
            train.Id = 1;
            List<Wagon> wagons = new List<Wagon>();
            wagons.Add(new Wagon { Number = 1, Weight = 23 });
            wagons.Add(new Wagon { Number = 1, Weight = 23 });
            wagons.Add(new Wagon { Number = 1, Weight = 23 });
            wagons.Add(new Wagon { Number = 1, Weight = 23 });
            wagons.Add(new Wagon { Number = 1, Weight = 23 });
            wagons.Add(new Wagon { Number = 1, Weight = 23 });
            train.Wagons = wagons;
            Depos.Add(train);

            List<Adress> Adresses = new List<Adress>();
            Adress adress = new Adress();
            adress.Id = 1;
            adress.Street = "Testing street";
            Adresses.Add(adress);
            List<Record> records = (from dep in Depos join adr in Adresses on dep.Id equals adr.Id select new Record { Id = dep.Id }).ToList();
        }
    }
    public class Record
    {
        public int Id { get; set; }

        public int Weight { get; set; }

        public string Street { get; set; }

        public int Number { get; set; }
    }

    public class Train
    {
        public int Id { get; set; }

        public List<Wagon> Wagons { get; set; }
    }

    public class Wagon
    {
        public int Weight { get; set; }

        public int Number { get; set; }
    }

    public class Adress
    {
        public int Id { get; set; }
        public string Street { get; set; }
    }
}

做这个的最好方式是什么?

您需要使用SelectMany ,或者在查询语法中使用, from只需一秒钟,即可拉平列表列表:

  List<Record> records =(from dep in Depos 
                         join adr in Adresses on dep.Id equals adr.Id 
                         from wgn in dep.Wagons
                         select new Record 
                         { 
                            Id = dep.Id, 
                            Number = wgn.Number, 
                            Weight = wgn.Weight, 
                            Street = adr.Street 
                          }).ToList();

或具有扩展方法的可读性较低的LINQ :)

IEnumerable<Record> records = 
    Depos.Join(Adresses, 
               myTrain => train.Id, 
               addr => addr.Id, 
               (myTrain, addr) => myTrain.Wagons
                                         .Select(wagon => new Record 
                                         { 
                                             Id = addr.Id, 
                                             Street = addr.Street, 
                                             Number = wagon.Number, 
                                             Weight = wagon.Weight 
                                         }))
         .SelectMany(myWagons => myWagons);

如您所见, SelectMany方法是此查询的关键方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM