2016-07-24 2 views
0

У меня есть список рейсов, которые я пытаюсь сгруппировать с полем даты, а затем выберите минимальную цену за каждую группу. В результате я должен получить самых дешевых рейсов в сутки.Как группировать список по полю и выбирать в группы мин другого поля через linq?

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); 
    } 
Смежные вопросы