2013-02-07 42 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 
      };