LINQ到实体 - 根据联接,条件和分类获得结果
我有一些代码可以通过3个单独列表的记录进行循环,并执行逻辑以创建一个新对象。它有效,但需要很长时间。我希望我可以将其全部简化为LINQ到实体查询。
本质上,我有一个人列表和电话号码列表。电话号码具有类型(“单元”,“家庭”,“办公室”)和等级(1-x)。如果某人有两个手机,那么等级应优先。
结果集应只有一个单元格(排名最低)和一个家庭电话(排名最低)。如果没有牢房或家庭电话,则应为null。
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<Person> people = new() { person1, person2, person3, person4, person5 };
List<Phone> 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);
I have some code that loops through records of 3 separate lists and performs logic to create a new object. It works but takes a very long time. I'm hoping I can simplify it all into a LINQ to Entities query.
Essentially, I have a list of People, and a List of Phone Numbers. The Phone numbers have a type ('cell', 'home', 'office', etc.) and a rank (1-x). If someone has two cell phones the the lower the rank should take priority.
The result set should have only one cell (the lowest ranking) and one home phone (the lowest ranking). These should be null if there is no cell or home phone.
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<Person> people = new() { person1, person2, person3, person4, person5 };
List<Phone> 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(quot;{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);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
尝试使用Linq。我给了您2个使用linqpad
try to use linq. i gave you 2 options for education using Linqpad