【问题标题】:Filtering on multiple DataTables with First DataTable使用第一个 DataTable 过滤多个 DataTable
【发布时间】:2016-04-27 10:41:04
【问题描述】:

我正在尝试将数据库表的详细信息导出到单个 Excel 文件中的多个工作表中,并且导出工作正常,但是使用第一个 DataTable 电子邮件 ID 进行多个 DataTable 过滤的问题。

以下是我的 C# 代码:

  protected void Button1_Click(object sender, EventArgs e)
{
     DataSet ds = new DataSet();
    DataTable dt = new DataTable("Registration Details");

    DataTable dt1 = new DataTable("Education Details");

    dt = bl.Get_Registrationdetailsbydate1(bo);

    dt1 = bl.Get_Registrationdetailsbydate2(bo);

    ds.Tables.Add(dt);

    ds.Tables.Add(dt1);

    ExcelHelper.ToExcel(ds, "Users.xls", Page.Response);   

}

我有两个表 Registration_table 和 Education_table,还有两个 DataTable Registration details 和 Education details。

我需要基于第一个 DataTable(dt) 的电子邮件 ID 的结果,第一个 DataTable 电子邮件 ID 的用户只应该进入第二个 DataTable,这意味着基于电子邮件 ID 的教育详细信息。

假设下面是第一个DataTable的详细信息。

sno    email            mobile        city

 1     raj@gmail.com     123456789    hyderabad

我需要如下单个用户的第二个 DataTable 详细信息的结果。

sno       email              education 

 1        raj@gmail.com       MBA

我使用两个存储过程来获取注册详细信息和第二教育详细信息。

【问题讨论】:

  • 您可以简单地修改您的存储过程以根据Registration_table 中存在的电子邮件获取数据。
  • 如何传递第一个 DataTable 电子邮件 ID,上面我使用了第一个数据表方法:Get_Registrationdetailsbydate1(bo);,你能更新答案吗? @Rahul Singh
  • 我的意思是将参数传递给您的存储过程,该过程正在获取教育详细信息,并且在 SP 中只需使用 WHERE 子句过滤数据。
  • 我认为,它很简单但很困惑,我使用这种方法获取注册详细信息:dt = bl.Get_Registrationdetailsbydate1(bo);此方法用于获取教育详细信息。 dt1 = bl.Get_Registrationdetailsbydate2(bo);。但是在填充第一个数据表之后,如何将参数传递给第二个过程意味着如何从第一个数据表 dt 获取电子邮件 ID 到第二个 dt1。 @Rahul Singh

标签: c# asp.net datatable


【解决方案1】:

恕我直言,最好的方法是在数据库端本身执行此操作,即当您根据这些详细信息获取注册详细信息时也会查询教育详细信息,但如果您的逻辑非常复杂而不是简单的表格,那么您将拥有循环遍历您的Registration DataTable 并将电子邮件地址作为参数传递以获取教育详细信息。尽管这将是一种复杂的方法,因为您必须将所有他的电子邮件存储在注册表中,然后获取教育详细信息。

foreach(DataRow row in  dtRegistration.Rows)
{
    string Email = row.Field<string>("Email");
    //store it in a collection or comma separeted string and pass it to
    //bl.Get_Registrationdetailsbydate2(bo); table.
}

如果您没有大量数据,并且您可以使用当前代码来了解如何填充两个数据表,那么让代码保持原样并简单地使用 LINQ 像这样过滤您的教育数据表:-

DataTable filteredEducation = dtEducation.AsEnumerable()
             .Where(x => dtRegistration.AsEnumerable()
                           .Any(z => z.Field<string>("Email") == x.Field<string>("Email")))
             .CopyToDataTable();

您必须导入System.Linq 命名空间。

更新:

最后,您的按钮 clcik 处理程序应如下所示:-

dt = bl.Get_Registrationdetailsbydate1(bo);
dt1 = bl.Get_Registrationdetailsbydate2(bo);
DataTable filteredEducation = dt1.AsEnumerable()
                                 .Where(x => dt.AsEnumerable()
                           .Any(z => z.Field<string>("Email") == x.Field<string>("Email")))
                           .CopyToDataTable();
ds.Tables.Add(dt);
ds.Tables.Add(filteredEducation);
ExcelHelper.ToExcel(ds, "DangoteUsers.xls", Page.Response);   

【讨论】:

  • 您能否也更新循环代码,正如您所说,我必须遍历您的注册数据表并将电子邮件地址作为参数传递以获取教育详细信息。 bo.para1 正在传递参数,我不知道上面代码中的 linq 或更新答案。 @Rahul Singh
  • @zahed - 已更新,但正如我所说的那样会很复杂,尝试 LINQ 方法,它非常简单直接。
  • 实际我有一千条数据,那么如何通过linq传递参数,上面你的linq回答让我很困惑,你能根据我的代码清楚地更新吗,请不要介意。 @Rahul Singh
  • @zahed - 不需要通过 LINQ 传递任何参数,这就是我所说的。你已经有两个数据表了,对吧?您想根据第一个过滤第二个表。正是我们正在使用 LINQ 做的,其中 caluse 将使用 Registration DataTable 中存在的那些电子邮件进行过滤。
  • 非常感谢,但是根据搜索日期,有 5 到 6 条记录丢失。 @Rahul Singh
猜你喜欢
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多