2013-02-14 3 views
0

List problemLinq для SQL в C# Уникальные данные

У меня есть длинный список с судов, которые я получаю от Linq к SQL запроса, но я хочу только одну строку для каждого ImoNo. Сегодня у меня около 4 строк на ImoNo. Мне просто нужна одна строка, которая была обновлена ​​в последний раз (поэтому в этом примере мне нужно 2013-01-27).

Это мой Linq To SQL запроса:

var res = from positions in context.Lloyds_ETAs 
      join vessels in context.Lloyds_Vessels on positions.ImoNumber equals vessels.imo_no 
      select new PositionData { 
       ImoNo = positions.ImoNumber, 
       PositionCordinates = positions.AIS_Latest_Position, 
       CompassOverGround = positions.Compass_over_Ground_Heading, 
       VesselId = positions.Vessel_ID, 
       Equipment = vessels.vessel_type, 
       Updated = positions.Last_Place_Location 
      }; 

return res.ToList(); 
+0

oh, [группа] (http://code.msdn.microsoft.com/LINQ-to-DataSets-Grouping-c62703ea), может быть? – lante

+0

Вы хотите последнюю обновленную строку на ImoNr? – Magnus

ответ

2
var res = (from positions in context.Lloyds_ETAs 
      join vessels in context.Lloyds_Vessels on positions.ImoNumber equals vessels.imo_no 
      select new PositionData { 
       ImoNo = positions.ImoNumber, 
       PositionCordinates = positions.AIS_Latest_Position, 
       CompassOverGround = positions.Compass_over_Ground_Heading, 
       VesselId = positions.Vessel_ID, 
       Equipment = vessels.vessel_type, 
       Updated = positions.Last_Place_Location 
      }) 
      .GroupBy(x => x.ImoNo) 
      .Select(g => g.OrderByDescending(pd => pd.Updated).First()); 
+0

Возможно, это правильно, но я думаю, что это приведет к созданию одного оператора SQL для каждой группы с использованием Linq2SQL. – Magnus

+0

@ Magnus И я думаю, что это именно то, чего хочет OP, поскольку он сказал: «Но я хочу только одну строку за ImoNo'. –

+0

Да, это даст правильный результат, но я думаю, что SQL, сгенерированный linq2SQL, будет одним утверждением для каждой группы. (очень медленно) Но я не проверял его, поэтому может быть неправильно. – Magnus

0

Если вы хотите, последний, все, что вам нужно сделать, это добавить .OrderBy(pd => pd.Updated).Last() после вашего выбора.

var res = (from positions in context.Lloyds_ETAs 
      join vessels in context.Lloyds_Vessels on positions.ImoNumber equals vessels.imo_no 
      select new PositionData { 
       ImoNo = positions.ImoNumber, 
       PositionCordinates = positions.AIS_Latest_Position, 
       CompassOverGround = positions.Compass_over_Ground_Heading, 
       VesselId = positions.Vessel_ID, 
       Equipment = vessels.vessel_type, 
       Updated = positions.Last_Place_Location 
      }).OrderBy(pd => pd.Updated).Last(); 

return res.ToList(); 
0
(yourQuery).OrderByDescending(pd=>pd.Updated).First() 
0

Есть несколько способов получить только одну «строку» в результате:

res.OrderByDescending(x => x.Updated).Take(1); 
res.OrderByDescending(x => x.Updated).First(); 
res.Order(x => x.Updated).Last(); 

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

Смежные вопросы