【问题标题】:How to select a subset from a DataTable through LINQ?如何通过 LINQ 从 DataTable 中选择一个子集?
【发布时间】:2011-02-16 15:39:11
【问题描述】:

我是 LINQ 的新手。 我有以下数据表

Name   Date       price1  price2
string DateTime   decimal decimal
Jan09  14.01.2009 10.0    12.0
Feb09  14.01.2009 11.0    13.0
Jan09  15.01.2009 10.0    12.5
Feb09  15.01.2009  9.0    10.0
Jan09  18.01.2009 10.0    12.5
Feb09  18.01.2009  9.0    10.0

姓名和日期是主复合键。

我想为每个日期选择所有名称,然后遍历新集合并选择下一个日期。

var subCollection =  tab.Rows.Cast<DataRow>().Select(r1 => r1["Date"]).Select<string>(r2 => r2["Name"])
foreach (DataRow row in subCollection)
{
    // do something with row
}

我的 Linq 表达式错误

【问题讨论】:

  • 您可以尝试使用 r1.Date 和 r2.Name 而不是您正在使用的,我也不认为中间的 会起作用,所以最好将其删除。如果没有其他人,我回家后会记录更多信息。

标签: c# linq select datatable subset


【解决方案1】:

我认为你想要的是按日期分组,然后查看给定日期的所有名称,然后大多数到下一个。

如果是这种情况,您想使用 Linq 组语法...

var query = from row in table.AsEnumerable()
        group row by row["Date"] into g
        select g;

您可以在网上找到很多使用 Linq 组语法做各种事情的示例。我发现重要的是意识到您可以按多个列进行分组,并且仍然可以使用以下语法应用 Sum、Max 或 Count 等聚合函数:

var query = from row in table.AsEnumerable()
    group row by new { Date = row["Date"], Price1 = row["Price1"] }  into g
    select new
    {
        Date = g.Key.Date,
        Price = g.Key.Price1,
        Count = g.Count()
    };

【讨论】:

  • 另外,为了做这样的事情,你真的应该检查 LinqPad (linqpad.net) 来运行小测试,而不是启动你试图重新创建的任何环境的完整实例。 ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多