[英]c# Dynamic.Linq - groupby and then select by condition
我以為會很容易,但是我真的為此感到掙扎。
我有一個具有這種模式的表:
名稱,日期,值
這是我要達到的目標:
#1可以通過GroupBy(“ Name”,“ it”)輕松實現,但是現在呢?
我如何查詢分組結果???
謝謝你們。
我從您的問題中得出的一個假設是“日期是最大的”,意思是每個日期都是最新的。
var data = new List<Data>
{
new Data() {Name = "one3", Date = new DateTime(2001, 11, 11), Value = 7},
new Data() {Name = "one2", Date = new DateTime(2001, 11, 11), Value = 111},
new Data() {Name = "one2", Date = new DateTime(2011, 11, 11), Value = 7},
};
var result = data.GroupBy(x => x.Name).Select(grouping => grouping.OrderByDescending(x => x.Date).Take(1).FirstOrDefault()).ToList();
我確定可能有更好的方法來執行linq查詢,但我希望這至少可以為您指明正確的方向:-)
我假設對於每個名稱,您都希望具有該名稱的最新日期的記錄的值。 如果這是正確的,那么以下應該工作
from d in new[]
{
new { Name = "x", Date = new DateTime(2000, 1, 1), Value = 1, },
new { Name = "x", Date = new DateTime(2001, 1, 1), Value = 2, },
new { Name = "y", Date = new DateTime(2000, 1, 1), Value = 3, },
}
group d by d.Name into g
let maxDate = g.Max(d => d.Date)
select new { Name = g.Key, Date = maxDate, Value = g.Single(p => p.Date == maxDate).Value }
如果需要,我也將Date包含在結果中。
看到
http://www.albahari.com/nutshell/predicatebuilder.aspx
和
http://tomasp.net/blog/dynamic-linq-queries.aspx
嘗試這個。 似乎對我有用:
我正在使用另一個答案中的數據。 希望這不會作弊...
var set = new[]
{
new {Name = "x", Date = new DateTime(2000, 1, 1), Value = 1,},
new {Name = "x", Date = new DateTime(2001, 1, 1), Value = 2,},
new {Name = "y", Date = new DateTime(2000, 1, 1), Value = 3,},
};
var query =
from x in set
orderby x.Date descending
group x by x.Name
into g
select g.First();
Console.WriteLine(query.First().Date);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.