Linq按名字姓氏分组并从子数组中选择

时间:2012-05-16 21:21:46

标签: c# .net linq

我正在使用Entity Framework并对数据库执行查询,该数据库返回公司,而公司又为每家公司提供了许多联系人。

我有两个场景,我想将具有相同名字和姓氏的MyContacts分组。

虽然我可以遍历存储结果的新对象数组,但我使用的是实体框架,并且必须多次加载数据的速度很慢,所以如果可能的话,我宁愿将对象维护为 - 在结果集中。

计划是我可以遍历结果数组,更改MyContacts对象,并将对象更新到EF存储库。

第一个场景是按名称对联系人列表进行分组,但我不确定如何在不创建新的类数据集的情况下进行分组。

第二个场景更复杂,我有一个MyAccounts列表(每个都有一个MyContacts列表),我想返回所有列表的MyContacts,按名字和姓氏分组,返回原始类如果可能的话。

非常感谢,克里斯。

我删除了数据访问权限并在下面做了一个简单示例:

class MyAccount
{
    public string accountName { get; set; }
    public List<MyContact> Contacts { get; set; }
}

class MyContact
{
    public string firstname { get; set; }
    public string lastname  { get; set; }
}

MyContact contactA = new MyContact() { firstname = "Chris", lastname = "b", ID = 100 };
MyContact contactB = new MyContact() { firstname = "Chris", lastname = "b", ID = 101 };
MyContact contactC = new MyContact() { firstname = "Peter", lastname = "Bread", ID = 102 };
MyContact contactD = new MyContact() { firstname = "James", lastname = "apple", ID = 103 };
MyContact contactE = new MyContact() { firstname = "Richard", lastname = "Brian", ID = 104 };
MyContact contactF = new MyContact() { firstname = "James", lastname = "apple", ID = 105 };

List<MyContact> contacts = new List<MyContact>();
contacts.AddRange(new MyContact[] { contactA, contactB, contactC, contactD, contactE, contactF } );
// how do i get a list of items, grouped by same first and lastname?

MyAccount companyA = new MyAccount() { accountName = "CompanyA", Contacts = new List<MyContact>() };
companyA.Contacts.AddRange(new MyContact[] { contactA, contactB, contactC });
MyAccount companyB = new MyAccount() { accountName = "CompanyB", Contacts = new List<MyContact>() };
companyB.Contacts.AddRange(new MyContact[] { contactA, contactB, contactC });
MyAccount companyC = new MyAccount() { accountName = "CompanyB", Contacts = new List<MyContact>() };
companyB.Contacts.AddRange(new MyContact[] { contactA, contactB, contactC, contactD, contactE });
List<MyAccount> companyList = new List<MyAccount>(new MyAccount[] { companyA, companyB, companyC });
// from the companyList, is there any way to get a list of MyContact types grouped by duplicate first and lastname?

2 个答案:

答案 0 :(得分:2)

试试这个......

    var result = from c in contacts
                 group c by new { c.firstname, c.lastname } into g
                 select g.ToList();

    var result1 = from c in companyList.SelectMany(company => company.Contacts)
                  group c by new { c.firstname, c.lastname } into g
                  select g.ToList();

现在你获得IEnumerable of Lists。

答案 1 :(得分:1)

首先,如果您计划提供大量数据,我建议您使用HashSet代替List。主要区别在于HashSet具有O(1)速度用于冲突测试(搜索重复属性),而如果使用List,则它使用O(n)算法。根据我的理解,您的最终目的是合并不同地址书籍的列表并获得独特的价值。如果要合并两个列表并仅获取唯一值,请使用linq的Union函数,如果您只想获取两个列表中重复的值,请使用Instersect