2017-05-15 5 views
-2
public class Event 
{ 
    public int Id { get; set; } 
    public string Emp { get; set; } 
    public DateTime EventDate { get; set; } 
    public DateTime AccessTime { get; set; } 
} 

var events = new List<Event>(){ 
    new Event(){Id=1,Emp ="A",EventDate= new DateTime(2017, 1, 2), AccessTime= DateTime.Now}, 
    new Event(){Id=2,Emp ="A",EventDate= new DateTime(2017, 1, 2), AccessTime= DateTime.Now.AddMinutes(4)}, 
    new Event(){Id=3,Emp ="A",EventDate= new DateTime(2017, 1, 2), AccessTime= DateTime.Now.AddMinutes(1)}, 
    new Event(){Id=4,Emp ="A",EventDate= new DateTime(2017, 1, 3), AccessTime= DateTime.Now}, 
    new Event(){Id=5,Emp ="A",EventDate= new DateTime(2017, 1, 3), AccessTime= DateTime.Now.AddMinutes(2)}, 
    new Event(){Id=6,Emp ="A",EventDate= new DateTime(2017, 1, 3), AccessTime= DateTime.Now.AddMinutes(3)}, 
    new Event(){Id=7,Emp ="B",EventDate= new DateTime(2017, 2, 2), AccessTime= DateTime.Now}, 
    new Event(){Id=8,Emp ="B",EventDate= new DateTime(2017, 2, 2), AccessTime= DateTime.Now.AddMinutes(1)}, 
    new Event(){Id=9,Emp ="B",EventDate= new DateTime(2017, 2, 2), AccessTime= DateTime.Now.AddMinutes(2)} 
}; 

最新のEventDateとAccessTimeでEmpsを取得するにはどうすればよいですか?まず、最新のEventDateを持つアイテムを取得します。 EventDateが同じ場合は、最新のAccessTimeでアイテムを取得します。このリストについては、結果はイベント6と9でなければなりません。サブ/グループ最大2回のLinqクエリ

+1

あなたは何を試してみましたか? –

+0

なぜあなたは団体を言っているのですか、ちょうど簡単な注文権がほしいと思うように聞こえますか? 'events.OrderByDescending(x => x.EventDate).ThenByDescending(x => x.AccessTime)'? – aquinas

+0

なぜ2が結果に含まれないのですか? –

答えて

0

これが何をしたいあなたを与える:

var result = events.GroupBy(x => x.Emp).Select(y => y.OrderByDescending(z => z.EventDate).ThenByDescending(q => q.AccessTime).First()); 
foreach (Event a in result) 
{ 
      Console.WriteLine(a.Id + "\t" + a.Emp + "\t" + a.EventDate + "\t" + a.AccessTime); 
} 

まずAccessTimeと選択するには、最初の線でより、EventDateによってOrderByDescendingオーダーグループ最初のよりもあなたは、emp表でGroupByする必要があります。

そして、最終的な結果は次のようになります。

0

あなたが探しているのはOrderByThenByです。あなたの例の場合:

events.OrderByDescending(x => x.EventDate) 
    .ThenByDescending(x => x.AccessTime); 

これは、最新のEventDate最初にしてAccessTimeによって(場合には、複数の日付が一致)してeventsを注文します。

最新のEventDateを持っていて、ID9のうち最新のものがAccessTimeであるため、結果にはID 9が続きます。

Dotnet Fiddle