2010-11-30 4 views
0

Я новичок в Linq. Я пытаюсь написать запрос linq, чтобы получить минимальное значение из набора записей. Мне нужно использовать функции groupby, where, select и min в том же запросе, но у меня возникают проблемы при использовании предложения group by. вот запрос, который я написалGroupby и where clause in Linq

var data =newTrips.groupby (x => x.TripPath.TripPathLink.Link.Road.Name) 
        .Where(x => x.TripPath.PathNumber == pathnum) 
        .Select(x => x.TripPath.TripPathLink.Link.Speed).Min(); 

Я не могу использовать группу, и где вместе она продолжает давать ошибку.

Мой запрос должен

  1. Выберите все значения.
  2. фильтровать его через предложение where (pathnum).
  3. Группа по дороге Название
  4. , наконец, получите минимальное значение.

может кто-нибудь сказать мне, что я делаю неправильно и как добиться желаемого результата.

Спасибо, Паван

+1

Что ошибка, и является ли это LINQ to SQL или что? – 2010-11-30 02:37:43

ответ

4

Это немного сложно, не зная отношения между данными, но я думаю (не пытаясь это), что это должно дать вам хочу, чтобы вы хотите - минимальная скорость в дороге по имени. Обратите внимание, что это приведет к сбору анонимных объектов со свойствами Name и Speed.

var data = newTrips.Where(x => x.TripPath.PathNumber == pathnum) 
        .Select(x => x.TripPath.TripPathLink.Link) 
        .GroupBy(x => x.Road.Name) 
        .Select(g => new { Name = g.Key, Speed = g.Min(l => l.Speed) }); 
+0

Я получаю ссылку на объект, не установленную в экземпляр ошибки объекта при выполнении цикла foreach, чтобы получить результаты. – Pawan 2010-11-30 04:29:21

+0

Получил его на работу. Спасибо, ребята за помощь – Pawan 2010-11-30 05:22:25

0

Так как я думаю, что вы хотите, чтобы поездка, которая имеет минимальную скорость, а не скорость, и я предполагаю, что различные структуры данных, я добавлю к ответу tvanfosson в:

var pathnum = 1; 
var trips = from trip in newTrips 
      where trip.TripPath.PathNumber == pathnum 
      group trip by trip.TripPath.TripPathLink.Link.Road.Name into g 
      let minSpeed = g.Min(t => t.TripPath.TripPathLink.Link.Speed) 
      select new { 
       Name = g.Key, 
       Trip = g.Single(t => t.TripPath.TripPathLink.Link.Speed == minSpeed) }; 

foreach (var t in trips) 
{ 
    Console.WriteLine("Name = {0}, TripId = {1}", t.Name, t.Trip.TripId); 
}