2013-02-07 37 views
-2

我需要選擇Name字段和max從DataCop時間字段不同的一列,最大不同, 此代碼不能正常工作,謝謝由另一列LINQ

List<Data> l = new List<Data>(); 
l.Add(new Data { Id = 0, Name = "A", DataCop = new DateTime(2012, 1, 4) }); 
l.Add(new Data { Id = 1, Name = "A", DataCop = new DateTime(2012, 1, 5) }); 
l.Add(new Data { Id = 2, Name = "A", DataCop = new DateTime(2012, 5, 4) }); 
l.Add(new Data { Id = 3, Name = "B", DataCop = new DateTime(2012, 3, 1) }); 
l.Add(new Data { Id = 4, Name = "B", DataCop = new DateTime(2012, 3, 5) }); 
l.Add(new Data { Id = 5, Name = "C", DataCop = new DateTime(2012, 2, 1) }); 
l.Add(new Data { Id = 6, Name = "D", DataCop = new DateTime(2012, 2, 1) }); 

DateTime start = new DateTime(2012,1,2); 
DateTime end = new DateTime(2012,4,1); 


var res = (from Data d in l 
      let max = l.Where(x => x.Id == d.Id).Max(x => x.DataCop) 
      let maxId = l.Where(x => x.Id == d.Id && x.DataCop == max) 
         .Select(x => x.Id).FirstOrDefault() 
      where d.DataCop >= start && d.DataCop <= end && 
       d.Id == maxId && d.DataCop == max 
      select d).ToList(); 


foreach (var item in res) 
{ 
    Console.WriteLine(item.Id.ToString() + "\t" + item.Name + "\t" + item.DataCop.ToShortDateString()); 
} 
Console.ReadLine(); 

回答

2

與LINQ方法語法

組由名稱,並選擇由DATACO有序各組的第一個項目(數據實例) p下降(這將會把最大日第一)

var res = l.GroupBy(m => m.Name) 
      .Select(g => g.OrderByDescending(x => x.DataCop) 
         .First()) 
      .ToList(); 

與查詢語法(混合)

var result = (from r in l 
       group r by r.Name into g 
       select g.OrderByDescending(x => x.DataCop) 
         .First()) 
      .ToList(); 
+0

非常感謝你 – andyww

+0

如何結合這與另一個對象加入,然後選擇新的來自某些屬性? – andyww

+0

@andyww最簡單的方法就是以新的需求(和代碼,你的樣本在這種情況下是完美的)提出一個新的問題(這個是基礎)。或者更新你的問題。 –

0
按名稱

組數據,然後選擇從每個組最後的數據:

var res = from d in l 
      group d by d.Name into g 
      let lastData = g.OrderByDescending(x => x.DataCop).First() 
      select new Data() 
      { 
       Name = g.Key, 
       Id = lastData.Id, 
       DataCop = lastData.DataCop 
      };