2016-11-16 9 views
0

は、私は、次のフィールドとPersonオブジェクトのデータベースを持っていると言いますその他のC#コード)Personが(米国)でのみ生まれたbirthDateを検索し、最大birthDatePersonを返します。この日付に複数の子が生まれた場合は、すべての子を返す必要があります。yのフィールドに対してのみ満たすオブジェクトからのXフィールドの最大値を取得する「真」

どうすればいいですか?あなたがしたいよう

+2

を、私は*強く*あなたがプロパティの.NET命名規則を次開始することをお勧めします。 –

+0

ありがとうございました。 – HeyJude

答えて

7

まあ、それが聞こえる:国別

  • フィルター
  • グループ
  • 降順でグループが最初のグループに
を取る誕生日
  • 注文で

    だから(規約に従うためにプロパティ名が固定されていると仮定して):

    var query = db.People 
           .Where(p => p.CountryOfBirth == "USA") 
           .GroupBy(p => p.BirthDate) 
           .OrderByDescending(p => p.Key) 
           .FirstOrDefault(); 
    

    米国で生まれた人がいないため、グループがない場合はnullが返されます。あれば代わりに空のシーケンスを返すには、最初の結果をフラット化できます。

    var query = db.People 
           .Where(p => p.CountryOfBirth == "USA") 
           .GroupBy(p => p.BirthDate) 
           .OrderByDescending(p => p.Key) 
           .Take(1) 
           .SelectMany(p => p); 
    
  • +1

    これはクエリを返すように設定されているので、 'TakeOf(1).SelectMany(g => g)'は 'FirstOrDefault'よりも適切でしょうか? –

    +0

    @IvanStoev:代わりに空のセットを返すことを意味しますか?確かに、それはうまくいくでしょう。そのオプションで更新されます。 –

    2

    が、私はそれが助け場合は2つのクエリでそれを行う方法を知っています。 https://dotnetfiddle.net/c3BNWp

    コード: はこの上の表情持っ余談として

    public class Program 
    { 
        public static void Main() 
        { 
         var list = new List<Person>(){ 
          new Person(){ 
           Name = "1", 
           countryOfBirth = "USA", 
           birthDate = new DateTime(2000,1,1) 
          }, 
           new Person(){ 
           Name = "2", 
           countryOfBirth = "USA", 
           birthDate = new DateTime(1999,1,1) 
          }, 
           new Person(){ 
           Name = "3", 
           countryOfBirth = "USA", 
           birthDate = new DateTime(2000,1,1) 
          }, 
           new Person(){ 
           Name = "4", 
           countryOfBirth = "Other", 
           birthDate = new DateTime(2000,1,1) 
          }, 
           new Person(){ 
           Name = "5", 
           countryOfBirth = "SomeOther", 
           birthDate = new DateTime(2000,1,1) 
          } 
         }; 
         var max = list.Where(p=> p.countryOfBirth == "USA").Max(a=> a.birthDate); 
         Console.WriteLine(max); 
         var maxList = list.Where(p=> p.countryOfBirth == "USA" && p.birthDate == max).ToList(); 
         foreach(var p in maxList){ 
          Console.WriteLine(p.Name); 
         } 
        } 
    } 
    
    class Person 
    { 
        public string Name {get; set;} 
        public DateTime birthDate { get; set; } 
        public string countryOfBirth { get; set; } 
    } 
    
    関連する問題