返回

LINQ到实体-根据连接、条件和排序获取结果

发布时间:2022-04-21 22:50:09 199

我有一些代码,可以循环3个独立列表的记录,并执行逻辑来创建一个新对象。这很有效,但需要很长时间。我希望我能将其简化为LINQ to Entities查询。

基本上,我有一份人员名单和一份电话号码清单。电话号码有一个类型(“手机”、“家庭”、“办公室”等)和一个等级(1-x)。如果有人有两部手机,级别越低的优先考虑。

结果集应该只有一个手机(排名最低)和一部家庭电话(排名最低)。如果没有手机或家庭电话,这些应该为空。

            Person person1 = new("Person", "One");
            Person person2 = new("Person", "Two");
            Person person3 = new("Person", "Three");
            Person person4 = new("Person", "Four");
            Person person5 = new("Person", "Five");

            Phone ph1 = new("1112222222", "home", 2, person1);
            Phone ph2 = new("1111111111", "cell", 1, person1);
            Phone ph3 = new("2223331111", "cell", 1, person2);
            Phone ph4 = new("3334441111", "cell", 1, person3);
            Phone ph5 = new("3335552222", "cell", 2, person3);
            Phone ph6 = new("4446662222", "home", 2, person4);
            Phone ph7 = new("5557772222", "cell", 3, person5);
            Phone ph8 = new("5557773333", "home", 2, person5);

            // Create two lists.
            List people = new() { person1, person2, person3, person4, person5 };
            List phones = new() { ph1, ph2, ph3, ph4, ph5, ph6, ph7, ph8 };

            ***//CAN A LINQ to ENTITIES QUERY PRODUCE THE DESIRED RESULTS
            var query =
                from person in people
                join ph in phones on person equals ph.Owner into persPh
                from personPhones in persPh.DefaultIfEmpty()
                select new PersonPhone
                {
                    FirstName = person.FirstName,
                    LastName = person.LastName,
                    CellPhoneNumber = personPhones?.Number ?? string.Empty, //<==== Needs to be lowest ranking number of type = "cell"
                    HomePhoneNumber = personPhones?.Number ?? string.Empty  //<==== Needs to be lowest ranking number of type = "home"
                };***

            foreach (PersonPhone v in query)
            {
                Console.WriteLine($"{v.FirstName + " " + v.LastName + ":",-15} {v.CellPhoneNumber,-15} {v.HomePhoneNumber,-15} ");
            }

            // This code Should produce the following output:
            //
            // Person One:    1111111111    1112222222
            // Person Two:    2223331111
            // Person Three:  3334441111    
            // Person Four:                 4446662222    
            // Person Five:   5557772222    5557773333


            public record class Person(string FirstName, string LastName);
            public record class Phone(string Number, string Type, int Rank, Person Owner);
            public record class PersonPhone(string FirstName, string LastName, string CellPhoneNumber, string HomePhoneNumber);
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
相关帖子