使用第一个 DataTable 进行多个 DataTable 的筛选

3
我将尝试将数据库表的详细信息导出到单个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”中存在的电子邮件获取数据。 - Rahul Singh
如何传递第一个DataTable的电子邮件ID,上面我使用了第一个DataTable方法:Get_Registrationdetailsbydate1(bo); 你能更新答案吗?@Rahul Singh - Mr doubt
我的意思是将参数传递给获取教育详细信息的存储过程,在存储过程中使用_WHERE_子句简单地过滤数据。 - Rahul Singh
我认为这很简单,但很困惑。我使用了以下的方法来获取注册详细信息: dt = bl.Get_Registrationdetailsbydate1(bo); 这个方法用于获取教育详情。dt1 = bl.Get_Registrationdetailsbydate2(bo); 在填充第一个datatable之后,如何将参数传递给第二个过程,也就是如何从第一个datatable dt获取电子邮件id到第二个dt1中。 @Rahul Singh - Mr doubt
1个回答

1

我认为最好的方法是在数据库端执行此操作,即在根据注册详细信息获取注册详细信息时查询教育详细信息,但如果您的逻辑非常复杂而不是简单的表格,则必须遍历您的Registration DataTable并将电子邮件地址作为参数传递以获取教育详细信息。虽然这将是一种复杂的方法,因为您将不得不在Registration表中存储所有电子邮件地址,然后获取教育详细信息。

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命名空间

更新:

最终,你的按钮单击处理程序应该像这样:

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);   

你能否更新循环代码呢?正如你所说,我必须遍历你的Registration DataTable并将电子邮件地址作为参数传递以获取教育细节。bo.para1正在传递参数,我不了解linq或以上代码的更新答案。@Rahul Singh - Mr doubt
我实际上有成千上万的数据,那么如何通过LINQ传递参数?您上面的LINQ答案让我感到困惑,您能否根据我的代码进行更清晰的更新,请不要介意。@Rahul Singh - Mr doubt
请根据我上面的C#问题代码更新所有button_click代码答案,这将对我更有帮助,我已经在上面的问题代码中提到了两个datatable,正在等待您的linq更新答案。@Rahul Singh - Mr doubt
1
非常感谢,但是根据日期搜索,有5到6条记录丢失了。@Rahul Singh - Mr doubt
我在哪里以及如何使用trim函数?@Rahul Singh - Mr doubt
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接