如何解决"来源不包含DataRows"?

时间:2015-01-19 08:22:32

标签: c# datatable

在这里,我想找到两个数据表中的匹配记录。代码是

public DataTable textfiltering(DataTable dtfff, DataTable dtff)
{
   DataTable ds = (DataTable)Session["maintxt"];
   DataTable dts = (DataTable)Session["sectxt"];
   dtfff = ds;
   dtff = dts;     

   DataTable dtMerged = (from a in dtfff.AsEnumerable()
                          join b in dtff.AsEnumerable()
                          on a["contacts"].ToString() equals b["contacts"].ToString()
                          into g                                 
                          where g.Count()>0                             
                          select a).CopyToDataTable();
           return dtMerged;    

}

它给出了#34;源不包含DataRows"当数据表不包含匹配记录时... 如何纠正它......请给出你的建议

1 个答案:

答案 0 :(得分:6)

两种方式:

  1. 在致电Enumerable.Any
  2. 之前,检查其是否包含CopyToDataTable
  3. 使用dtfff.Clone创建一个与源表具有相同模式的空DataTable,并使用循环从LINQ查询中填充它。
  4. 第一种方法:

    var rows = from a in dtfff.AsEnumerable()
               join b in dtff.AsEnumerable()
               on a["contacts"].ToString() equals b["contacts"].ToString()
               into g
               where g.Count() > 0
               select a;
    DataTable merged;
    if (rows.Any())
       merged = rows.CopyToDataTable();
    else
        merged = dtfff.Clone();
    return merged;
    

    第二种方法:

    DataTable merged = dtfff.Clone();
    foreach (DataRow sourceRow in rows)
    {
       merged.ImportRow(sourceRow);  // or add all fields manually
    }
    return merged;
    

    我更喜欢第二种方法,因为它只需要执行一次查询。