2017-10-07 70 views
0

我有了这样的样本数据的DataTable具有通过分组日期点击数的最大值ID:如何获得,通过在LINQ

ID | HITS | Date 
1 | 12 | 1 October 2017 
2 | 15 | 1 October 2017 
3 | 13 | 1 October 2017 
4 | 5 | 1 November 2017 
5 | 7 | 1 November 2017 
6 | 3 | 1 November 2017 

,我想结果是:

ID 
2 ==> 15 is the max value for hits in Oct 2017 
5 ==> 7 is the max value for hits in Nov 2017 

首选VB.NET。我们可以在TSQL中做到这一点,因为数据已经在DataTable中了,所以我们必须在Linq级别进行操作。

任何想法?

+0

对日期进行了更改以使其更简单 – dcpartners

+0

您可以对'DataTable.AsEnumerable'和Field(Of ...)使用linq来求和,过滤(WHERE)和组值。你有尝试过什么吗?那些仍然不是日期,所以他们是字符串? – Plutonix

回答

2

为了做到运行此查询,您需要做四件事情:按日期

  • 集团
  • 令每个组由命中计数降序排列
  • 选择每组的第一个元素
  • 利用其ID

在C#中的样本应该是这样的:

var res = dataTable.AsEnumerable() 
    .Select(r => new { 
     Id = r.Field<int>("Id") 
    , Hits = r.Field<int>("Hits") 
    , Date = r.Field<DateTime>("Date") // Use proper type here 
    }) 
    .GroupBy(r => r.Date) 
    .Select(g => new { 
     Id = g.OrderByDescending(r => r.Hits).First().Id 
    , Date = g.Key 
    ) 
    .ToList(); 
+0

谢谢你。任何想法在VB.NET中做到这一点? – dcpartners

0

我看到你已经用UiPath标记了这个。它不支持匿名类型,所以LINQ很麻烦,但是,您可以使用Datatable.Select(string)方法来使用类似SQL的语法并查询DataTable。 DataTable.Select的语法与DataColumn.Expression中的相同。

我也想指向teleriks .Net代码转换器,因为stackoverflow充满了漂亮的.NET,但它永远不会在VB中。