如何在Linq中使用Group By和MAX返回多行?

时间:2016-04-15 20:47:23

标签: c# sql linq

澄清示例 我有一个用户数据库,由扫描Active Directory的脚本创建。它应用的一个领域是" ScanDate"字段,指示扫描何时发生。该脚本扫描多个Active Directory域。

目标:从数据库中获取IList,其中包含所有域的用户列表,但ScanDate是每个域的MAX(ScanDate)。

这可确保我获得每个域的最新数据。

似乎对我有用的SQL查询:

SELECT *
FROM ADScans a
WHERE a.ScanDate = (SELECT MAX(b.ScanDate) FROM ADScans b WHERE a.Domain = b.Domain) AND Enabled = 1

但是,无法在LINQ中表达

<击> e.g:

<击>

类别|日期

Cat1 4/4/16

Cat2 | 16年4月4日

Cat3 | 16年4月4日

Cat1 | 16年4月3日

我希望有一个清单:

Cat1 | 16年4月4日

Cat2 | 16年4月4日

Cat3 | 16年4月4日

一些澄清

我希望每个类别返回多行 - MAX(日期)不会只给我一个。我希望获得每个类别的MAX(日期)的所有行。

4 个答案:

答案 0 :(得分:0)

您可以GroupBy Domain获取最大ScanDate,然后只保留该日期的行。

对于这样的模型:

class ADScan
{
    public int Domain { get; set; }

    public DateTime ScanDate { get; set; }
}

您可以执行扫描:

var result = scans.GroupBy(s => s.Domain)
                  .SelectMany(g => g.Where(s => s.ScanDate == g.Max(d => d.ScanDate)));

这会生成一个集合,其中包含ScanDate的最大Domain次扫描。

答案 1 :(得分:0)

这样的事情应该有效:

var result =
    list
    //Group by Category
    .GroupBy(x => x.Category)
    //For each Category, select Category and max Date within the Category
    //This would create an anonymous object, you could do a "new Entity" instead if you want
    .Select(g => new {Category = g.Key, Date = g.Max(x => x.Date)}) 
    .ToList();

答案 2 :(得分:0)

我是个白痴。

from u in this.db.ADScans
where u.ScanDate == 
    (from s in this.db.ADScans where u.Domain == s.Domain select s.ScanDate).Max() 
    && u.Enabled
select u;

答案 3 :(得分:0)

而不是使用 //in google apps script function myFunction() { var option = { "contentType" : "charset=euc-kr" }; var response = UrlFetchApp.fetch("~~~url~~~", option); Logger.log(response.getContentText()); } ,只需订购组中的项目并选择顶部项目:由于您订购了商品,因此保证是最高的商品:

Max()