2013-02-14 60 views
0

List problemLINQ到在C#SQL獨特的數據

我有一個長長的清單與船隻,我從一個LINQ到SQL查詢,但我只希望每ImoNo一行。今天,我每ImoNo約有4行。我只需要最後一次更新的那一行(所以在這個例子中我需要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

哦,[組](http://code.msdn.microsoft.com/LINQ-to-DataSets-Grouping-c62703ea)也許? – lante 2013-02-14 18:47:45

+0

你想要每個ImoNr上次更新的行嗎? – Magnus 2013-02-14 18:51:54

回答

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

這可能是正確的,但我認爲這將使用Linq2SQL爲每個組生成一條SQL語句。 – Magnus 2013-02-14 18:55:37

+0

@Magnus我認爲這正是OP想要的,正如他所說的:「但我只需要每行ImoNo一行。 – 2013-02-14 18:57:14

+0

是的,這會給出正確的結果,但我認爲由linq2SQL生成的SQL將是每個組的一個聲明。 (很慢)但我沒有測試過,所以可能是錯的。 – Magnus 2013-02-14 18:58:50

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(); 

看來你有一些重複的,所以通過將更多的也許做一組適當。