我正在尝试将数据库表详细信息导出到单个Excel文件中的多个工作表中,并且导出工作正确,但是使用First 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注册详细信息和教育详细信息。
我需要基于第一个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
我正在使用两个存储过程来获取注册详细信息和第二个教育详细信息。
答案 0 :(得分: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);