2017-08-29 85 views
-1

這是表「歷史」爲每個ID

id value date 
1 1 01/01/2017 20:20:20 
1 2 02/01/2017 20:20:20 
1 3 03/01/2017 20:20:20 
2 5 01/01/2017 20:20:20 
2 6 02/01/2017 20:20:20 

如何使用LINQ每個ID選擇最大值

context.History 
    .GroupBy(x => x.id) ?? 
    .SelectOnlyWithMax(z => z.date) ?? 

在結果只有兩個對象

id value date 
1 3 03/01/2017 20:20:20 
2 6 02/01/2017 20:20:20 
最大日期選擇值
+0

請出示你已經嘗試了什麼,也許用'GroupBy' ... –

+0

你想要什麼結果,開始'Id','Value',或最高日整行? –

+0

另外,你是否需要這個實體框架?如果是這樣,它可能會限制一些可能的答案。 –

回答

2

如果您希望每個Id的日期最高的整個行都可以使用以下代碼(使用LinqPad編寫)。如果你只想要Id,你可以使用@ BurnsBA的答案,因爲它會稍微更有效率。

void Main() 
{ 
    var data = new List<Record> 
    { 
     new Record(){Id=1, Value=1, Date=new DateTime(2017,1,1)}, 
     new Record(){Id=1, Value=2, Date=new DateTime(2017,2,1)}, 
     new Record(){Id=1, Value=3, Date=new DateTime(2017,3,1)}, 
     new Record(){Id=2, Value=5, Date=new DateTime(2017,1,1)}, 
     new Record(){Id=2, Value=6, Date=new DateTime(2017,2,1)}, 
    }; 


    var query = data.GroupBy(d => d.Id) 
        .SelectMany(g => g.OrderByDescending(d => d.Date) 
             .Take(1)); 
    query.Dump(); 
} 

public class Record 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
    public DateTime Date { get; set; } 
} 

結果:

enter image description here

首先它按Id,然後降序排序由Date的組中的項,並返回第一個,然後SelectMany變平的列表。

1

我建議MoreLINQMaxBy函數,即:

context.History.GroupBy(x => x.id).Select(x => x.MaxBy(y => y.date)) 
+0

這個實體框架是否兼容?這個問題沒有用EF標記,而是從他們通過名爲'context'的變量查詢的方式,以及他們提到「表」的事實,這讓我認爲他們需要支持Entity Framework的東西。基於'MaxBy'源代碼的快速掃描,它可能不是。 –

1
public class History 
{ 
    public int id { get; set; } 
    public int value { get; set; } 
    public DateTime date { get; set; } 
} 

// setup: 
var values = new List<History>(); 
values.Add(new History() { id = 1, value = 1, date = DateTime.Parse("01/01/2017 20:20:20") }); 
values.Add(new History() { id = 1, value = 2, date = DateTime.Parse("02/01/2017 20:20:20") }); 
values.Add(new History() { id = 1, value = 3, date = DateTime.Parse("03/01/2017 20:20:20") }); 
values.Add(new History() { id = 2, value = 5, date = DateTime.Parse("01/01/2017 20:20:20") }); 
values.Add(new History() { id = 2, value = 6, date = DateTime.Parse("02/01/2017 20:20:20") }); 

// result : 
values.GroupBy(
    x => x.id, 
    y => y.date, 
    // Below, dates will be enumerable 
    (id, dates) => new { id = id, date = dates.Max() } 
) 

// returns enumerable collection of anonymous type: 
{ 
    { id = 1, date = [3/1/2017 8:20:20 PM] }, 
    { id = 2, date = [2/1/2017 8:20:20 PM] } 
}