【问题标题】:Merge two DataTables with LINQ使用 LINQ 合并两个数据表
【发布时间】:2013-08-15 16:23:03
【问题描述】:

我的问题也类似THIS

我有两个数据表:

数据表 1:

Column 1: Date
Column 2: Requests 1

数据表2:

Column 1: Date
Column 2: Requests 2

我需要下面的结果:

新数据表:

Column 1: Date
Column 2: Requests 1
Column 3: Requests 2

预期结果:

Date            Requests 1  Requests 2    Total
15/08/2013      25          40            60
14/08/2013      40          60            100
13/08/2013      40          0             25
12/08/2013      0           80            80

到目前为止我做了什么:

DataTable Lista_1 = ds.Tables[0];
DataTable Lista_2 = ds.Tables[1];

var myLINQ = from l1 in Lista_1.AsEnumerable()
             join l2 in Lista_2.AsEnumerable() 
             on l1.Field<DateTime>("Date") equals l2.Field<DateTime>("Date")
             select new
             {
                 dateRelatorio = l1.Field<DateTime>("Date"),
                 request1Relatorio = l1.Field<int>("Total"),
                 request2Relatorio = l2.Field<int>("contagem"),
                 total = l1.Field<int>("Total") + l2.Field<int>("contagem")
             };

我想返回一个 IList 集合 (System.Collections.IList)

更新

listReturn = new List<Stats>();
public class Stats
{
public DateTime dateRelatorio { get; set; }
public int request1Relatorio { get; set; }
public int request2Relatorio { get; set; }
public int total { get; set; }
}

更新 2

可能在 List_1 中有日期在 List_2 中没有,反之亦然,因此 Request 需要为 0。

【问题讨论】:

  • 代码好像没问题,加.ToList()
  • 一个Ilist&lt;OfWhat&gt;?您不能从该方法返回匿名类型。
  • 如果第一个表中有 3 行日期为 15/08/2013 而第二个表中有两行日期相同怎么办?结果表需要 6 行?
  • 要使用LINQ to DataSet,您必须将其转换为Enumerable stuff,但要返回DataTable,据我所知您必须使用CopyToDataTable(),但这种方法似乎没有支持匿名类型(以 3 列作为属性)。我认为您无法使用 LINQ 解决此问题。
  • @KingKing: CopyToDataTable 仅适用于 IEnumerable&lt;DataRow&gt;。但是,您可以在反射的帮助下使其与任何东西一起工作(效率不高):msdn.microsoft.com/en-us/library/bb669096.aspx

标签: c# linq linq-to-sql datatable dataset


【解决方案1】:

如果你需要把这个东西封装在一个方法中,你应该创建一个类来返回:

public class DailyReport
{
  public DateTime Date {get; set;}
  public int Requests1 {get; set;}
  public int Requests2 {get; set;}
  public int Total // this can be calculated on the fly
  {
    get {return Requests1 + Requests2; }
  }
}

然后做

public List<DailyReport> GetDailyReports(..parameters if needed...)
{
  ...
  var myLINQ = from ...
         select new DailyReport {
             Date = l1.Field<DateTime>("Date"),
             Requests1 = l1.Field<int>("Total"),
             Requests2 = l2.Field<int>("contagem"),
         };
  return myLINQ.ToList();
}

有一些肮脏的技巧可以让您返回匿名对象的集合,但我建议不要这样做。

【讨论】:

  • 我们快到了。我只有一个问题。当 List_1 有一个日期时,List_2 中没有,List_2 中的请求需要为 0,反之亦然,就像我的预期结果一样。
猜你喜欢
  • 2018-04-03
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多