2016-07-24 13 views
0

私は日付フィールドでそれをグループ化しようとする飛行のリストを持っていますし、それからグループごとに最低価格を選択してください。結果では、 一日で最も安い便をご利用ください。linqを使ってフィールドをグループ化し、別のフィールドのグループminを選択する方法は?

enter image description here

(from flights in aFlightList 
            where flights.IsDeparture && flights.OnlyTour == "0" && flights.OnlyPhone == "0" 
            group flights by flights.FlightDateFull 
             into grouping 
             select grouping.OrderBy(a => a.FlightDateFull).First()).ToArray(); 

日付でリストをグループ化し、このコードが、格安航空券を取得することはできません。 私はこのような試してみてください。

(from flights in aFlightList 
            where flights.IsDeparture && flights.OnlyTour == "0" && flights.OnlyPhone == "0" 
            group flights by flights.FlightDateFull 
             into grouping 
             select grouping.OrderBy(a => a.FlightDateFull).Min(d=>d.PriceView)).ToArray(); 

この方法では、エラーが発生します。

これを行う方法?

答えて

1

group byの結果はグループ化のリストであり、グループ化はそのキーとそのキーを共有する要素のリストで構成されます。

最初の質問をお聞かせください。グループ別の操作はaFlightListを日付別にグループ化するため、グループ要素を日付順に並べる必要はありません(同じものです)。しかし、価格で注文することができますので、Firstは最低価格の要素を返します。最後に、group byの結果のグループの順序があなたの望むものと異なる可能性があるので、のグループ(またはその一部)をグループに注文することができます。すべてのことが言われていると

、変更されたクエリは、このようなことができます:

(from flights in aFlightList 
where flights.IsDeparture && flights.OnlyTour == "0" && flights.OnlyPhone == "0" 
group flights by flights.FlightDateFull 
into grouping 
orderby grouping.Key 
select grouping.OrderBy(e => e.PriceView).First()) 
.ToArray(); 
1

あなたが望む結果で新しいオブジェクトを作成し、その上で選択を行うことができます。例:

class Flight 
    { 
     public bool IsDeparture; 
     public string OnlyTour; 
     public string OnlyPhone; 
     public DateTime FlightDateFull; 
     public decimal PriceView; 
    } 

    [TestMethod] 
    public void FlightTest() 
    { 
     // Arrange 
     var flightList = new List<Flight> { 
      new Flight { IsDeparture = true, OnlyPhone = "0", OnlyTour = "0", FlightDateFull = new DateTime(2016,8,7), PriceView = 1 }, 
      new Flight { IsDeparture = true, OnlyPhone = "0", OnlyTour = "0", FlightDateFull = new DateTime(2016,8,7), PriceView = 2 }, 
      new Flight { IsDeparture = true, OnlyPhone = "0", OnlyTour = "0", FlightDateFull = new DateTime(2016,8,8), PriceView = 2 }, 
      new Flight { IsDeparture = true, OnlyPhone = "0", OnlyTour = "0", FlightDateFull = new DateTime(2016,8,8), PriceView = 3 } 
     }; 

     // Act 
     var result = (from flights in flightList 
         where flights.IsDeparture && flights.OnlyTour == "0" && flights.OnlyPhone == "0" 
         group flights by flights.FlightDateFull into grouping 
         select new { Date = grouping.Key, MinPrice = grouping.Min(a => a.PriceView) }).OrderBy(a => a.Date).ToList(); 

     // Assert 
     Assert.AreEqual(new DateTime(2016, 8, 7), result[0].Date); 
     Assert.AreEqual(1, result[0].MinPrice); 
     Assert.AreEqual(new DateTime(2016, 8, 8), result[1].Date); 
     Assert.AreEqual(2, result[1].MinPrice); 
    } 
関連する問題