获取内部联接LINQ查询的列

时间:2012-10-18 07:01:38

标签: c# linq datatable

我正在尝试使用Linq在2个DataColumns上内连接2个DataTables,我可以使用Linq获取行,但是我无法获取列。我已经注释了我试图获取列的内容,如下所示。

这样做的原因。

我打算制作3个方法,LEFT JOIN,FULL JOIN和INNER JOIN,它们将返回一个DataTable,我试图让它尽可能通用,如果以下是一个好方法,我不会显示,我需要做到尽可能优化。

     public static DataTable InnerJoin
     (DataTable dt1, DataTable dt2,DataColumn Parent,DataColumn Child)
     {
          DataTable result = new DataTable();


          var query =
              from d in dt1.AsEnumerable()
              join c in dt2.AsEnumerable() on d[Parent] equals c[Child]
              select new { d, c };
         /*
         var columns  = from d in dt1.Columns.Cast<DataColumn>()
                        from c in dt2.Columns.Cast<DataColumn>()
                          select new{c,d}
          foreach (var column in columns)
          {
              result.Columns.Add(column);
          }
          **/

          foreach (var row in query)
          {
              result.Rows.Add(row);
          }

         return result;
     }

1 个答案:

答案 0 :(得分:1)

您的代码会编译,因为overload需要params object[]。但是,您需要添加两个类型为DataRow的列。

public static DataTable InnerJoin(DataTable dt1, DataTable dt2, DataColumn Parent, DataColumn Child)
{
    DataTable result = new DataTable();
    result.Columns.Add("Row1", typeof(DataRow));
    result.Columns.Add("Row2", typeof(DataRow));

    var query =
        from row1 in dt1.AsEnumerable()
        join row2 in dt2.AsEnumerable() on row1[Parent] equals row2[Child]
        select new { row1, row2 };

    foreach (var x in query)
    {
        result.Rows.Add(x.row1, x.row2);
    }

    return result;
}

如果那就是你需要的,它应该有用。

编辑:这是一个(工作)测试

DataTable table1 = new DataTable("table1");
table1.Columns.Add("ID", typeof(int));
table1.Columns.Add("Name", typeof(String));

object[] a1 = { 1, "T1Row1Name" };
object[] a2 = { 2, "T1Row2Name" };
object[] a3 = { 3, "T1Row3Name" };
object[] a4 = { 4, "T1Row4Name" };
table1.Rows.Add(a1);
table1.Rows.Add(a2);
table1.Rows.Add(a3);
table1.Rows.Add(a4);

DataTable table2 = new DataTable("table2");
table2.Columns.Add("ID", typeof(int));
table2.Columns.Add("Name", typeof(String));
table2.Columns.Add("Table1ID", typeof(int));


object[] b1 = { 1, "T2Row1Name", 1 };
object[] b2 = { 2, "T2Row2Name", 2 };
object[] b3 = { 3, "T2Row3Name", 2 };
object[] b4 = { 4, "T2Row4Name", 2 };
object[] b5 = { 5, "T2Row5Name", 3 };
table2.Rows.Add(b1);
table2.Rows.Add(b2);
table2.Rows.Add(b3);
table2.Rows.Add(b4);
table2.Rows.Add(b5);

var joinedTable = InnerJoin(table1, table2, table1.Columns["ID"], table2.Columns["Table1ID"]);

foreach (DataRow r in joinedTable.Rows)
{
    DataRow r1 = r.Field<DataRow>("Row1");
    DataRow r2 = r.Field<DataRow>("Row2");
    String r1Name = r1.Field<String>("Name");
    String r2Name = r2.Field<String>("Name");
}