5

匿名選択への linq クエリ内で、2 つのプロパティから文字列を連結したいと考えています。

たとえば、あるグループの中で最年長の人物の氏名を検索する場合です。

var personsAndOldest = db.Persons.GroupBy(person => person.SomeThingThatCanBeGroupedForPerson).Select(a => new
            {
                FirstName = a.FirstOrDefault().FirstName,
                LastName = a.FirstOrDefault().LastName,
                BirthDate = a.FirstOrDefault().BirthDate,
                FullnameOfOldes = a.Aggregate((pers1, pers2) => pers1.BirthDate > pers2.BirthDate ? pers1 : pers2).FirstName + " " //How do I get LastName of the old one (without using the full aggregate again)
            });

名と空白の後に LastName を取得するには、完全な集計を再度記述する必要がありますか?

4

3 に答える 3

1

Select:でラムダステートメントを使用できます。

var personsAndOldest = db.Persons.GroupBy(person => person.SomeThingThatCanBeGroupedForPerson).Select(a => 
    {
        var first = a.First();
        var oldest = a.Aggregate((pers1, pers2) => pers1.BirthDate > pers2.BirthDate ? pers1 : pers2);
        return new
        {
            FirstName = first.FirstName,
            LastName = first.LastName,
            BirthDate = first.BirthDate,
            FullnameOfOldes = oldest.FirstName + " " + oldest.LastName)
        };
    });
于 2012-11-15T15:37:13.810 に答える
1

これを次のように行うことができます

var personsAndOldest = db.Persons
    .GroupBy(person => person.SomeThingThatCanBeGroupedForPerson)
    .Select(g => new 
        {
            a = g.First(),
            o = g.Aggregate((pers1, pers2) =>
                pers1.BirthDate > pers2.BirthDate ? pers1 : pers2)
        })
    .Select(pair => new
        {
            FirstName = pair.a.FirstName,
            LastName = pair.a.LastName,
            BirthDate = pair.a.BirthDate,
            FullnameOfOldes = pair.o.FirstName + " " + pair.o.LastName
        });
于 2012-11-15T15:30:50.817 に答える
0
  • を使用letして、新しい範囲変数を導入できます。
  • 割り当てられたプロパティの名前と等しい場合、匿名型のプロパティ名を指定する必要はありません
  • OrderBy最年長の人が見つかると思います(ただし、集計を使用してパフォーマンスを比較できます)
  • 最年長者は生年月日が最も短い人だと思うので、集計を次のように変更する必要がありますpers1.BirthDate < pers2.BirthDate ? pers1 : pers2

そう

var personsAndOldest = from p in db.Persons
                       group p by p.SomeThingThatCanBeGroupedForPerson into g
                       let first = g.FirtOrDefault()
                       let oldest = g.OrderBy(x => x.BirthDate).FirstOrefault()
                       select
                       {
                           first.FirstName,
                           first.LastName,
                           first.BirthDate,
                           FullnameOfOldes = oldest.FirstName + " " + oldest.LastName
                       };
于 2012-11-15T15:45:28.460 に答える