1

私はEntityFrameworkを使用しており、会社ごとに多数の連絡先を持つ会社を返すデータベースに対してクエリを実行しています。

同じ姓名を持つMyContactsをグループ化する2つのシナリオがあります。

結果が保存されている新しいオブジェクトの配列をループすることはできますが、Entity Frameworkを使用しているため、データを複数回ロードする必要があるので時間がかかるため、可能であれば、オブジェクトをそのまま維持することをお勧めします。結果セット。

計画では、結果の配列をループし、MyContactsオブジェクトに変更を加え、オブジェクトをEFリポジトリに更新できます。

最初のシナリオは、連絡先リストを名前でグループ化することですが、新しいクラスデータセットを作成せずにグループ化する方法がわかりません。

2番目のシナリオはもっと複雑です。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?
4

2 に答える 2

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を取得できます。

于 2012-05-16T21:26:49.127 に答える
1

まず、大量のデータを計画している場合は、のHashSet代わりにを使用することを強くお勧めしますList。主な違いは、HashSet衝突テスト(繰り返しプロパティの検索)にO(1)の速度があるのに対し、を使用する場合ListはO(n)アルゴリズムを使用することです。私が理解したところによると、あなたの最終的な意図は、さまざまなアドレス帳のリストをマージして、固有の値を取得することです。2つのリストをマージして一意の値のみを取得する場合は、linqのUnion関数を使用し、両方のリストで繰り返される値のみを取得する場合は、Instersect

于 2012-05-16T22:12:52.487 に答える