Linq在多列上连接数据表

时间:2014-05-07 12:29:59

标签: c# linq

我有一个linq语句,它接受两个数据表,并在每个表的id列上将它们连接在一起。我的问题是,有时我加入的值是在数据表的不同列中,我希望能够按原样使用该语句并查看另一列:

现有:

Datatable1.AsEnumerable()
           .Join(Datatable2.AsEnumerable(),
               dt1Row => Datatable1.Field<string>(rowid),
               dt2Row=> Datatable2.Field<string>(rowid),
               (dt1Row , dt2Row) => new { dt1Row , dt2Row}).ToList()
           .ForEach(o => {
               o.dt1Row.SetField(o.dt1Row.Table.Columns["name"].Ordinal, o.dt2Row.Field<string>("name1"));

           });

Datatable1.AsEnumerable()
           .Join(Datatable2.AsEnumerable(),
              //Trying to work out?
              ( dt1Row => Datatable1.Field<string>("rowid"),
               dt2Row=> Datatable2.Field<string>("rowid"))
              || ( dt1Row => Datatable1.Field<string>("rowid"),
               dt2Row=> Datatable2.Field<string>("name")),
               (dt1Row , dt2Row) => new { dt1Row , dt2Row}).ToList()

           .ForEach(o => {
               o.dt1Row.SetField(o.dt1Row.Table.Columns["name"].Ordinal, o.dt2Row.Field<string>("name1"));

           });

3 个答案:

答案 0 :(得分:1)

抱歉拖延, 你可以使用这种方法:

var dt1 = DataTable1.AsEnumerable();
var dt2 = DataTable2.AsEnumerable();

 var query = (from dt1Row in dt1
              from dt2Row in dt2
              where dt1Row["rowid"] == dt2Row["rowid"] ||
                    dt1Row["rowid"] == dt2Row["name"]

              select new
              {
                  dt1Row,
                  dt2Row
              });

答案 1 :(得分:0)

您可以使用iif声明:

.Join(Datatable2.AsEnumerable(),
      dt1Row => Datatable1.Field<string>("rowid"),
      dt2Row => condition ? Datatable2.Field<string>("rowid") : Datatable2.Field<string>("name"),
      (dt1Row , dt2Row) => new { dt1Row , dt2Row})

condition必须返回boolean

答案 2 :(得分:0)

使用任何dt.Any()作为条件在Join for Datatable2中添加了另一个Linq语句

Join(Datatable2.AsEnumerable(),
  dt1Row => Datatable1.Field<string>("rowid"),
  dt2Row => Datatable1.AsEnumerable.Any(x => x.Field<string>("rowid") == Datatable2.Field<string>("rowid"))
? Datatable2.Field<string>("rowid") : Datatable2.Field<string>("name"),
  (dt1Row , dt2Row) => new { dt1Row , dt2Row})