c# - 根据多个条件外部连接两个数据表

标签 c# .net linq join

我正在尝试根据多个条件使用 Linq 连接两个数据表。我能够使用这篇文章进行合并:Combining two tables into one .但是,该示例仅连接一个主键,我需要能够指定多个条件。

DataTable1(代码中的table1)

+-----------------------------------------------+
| CLIENT,USER_NAME,LAST_LOGIN_DT_TM,BIRTH_DT_TM |
+-----------------------------------------------+
| CLIENT1, USER1, 30-2014, 5-5-1980             |
| CLIENT1, USER2, 12-21-2014, 5-2-1990          |
| CLIENT2, USER3, 11-30-2014, 5-1-1950          |
| CLIENT2, USER4, 12-15-2014, 1-1-1900          |
+-----------------------------------------------+

DataTable 2(代码中的table2)

+-------------------------------+
| CLIENT,USER_NAME,TOTAL_ORDERS |
+-------------------------------+
| CLIENT1, USER1, 1500          |
| CLIENT2, USER2, 2500          |
+-------------------------------+

我希望输出看起来像这样:

+-------------------------------------------------------------+
| CLIENT,USER_NAME,LAST_LOGIN_DT_TM,BIRTH_DT_TM, TOTAL_ORDERS |
+-------------------------------------------------------------+
| CLIENT1, USER1, 1-30-2014, 5-5-1980, 1500                   |
| CLIENT1, USER2, 12-21-2014, 5-2-1990,                       |
| CLIENT2, USER2, 11-30-2014, 5-1-1950, 2500                  |
| CLIENT2, USER1, 12-15-2014, 1-1-1900,                       |
+-------------------------------------------------------------+

这是我目前所拥有的:

DataTable targetTable = table1.Clone();

var dt2Columns = table2.Columns
                       .OfType<DataColumn>()
                       .Select(dc => new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
var dt2FinalColumns = from dc in dt2Columns.AsEnumerable()
                      where targetTable.Columns.Contains(dc.ColumnName) == false
                      select dc;
                      targetTable.Columns.AddRange(dt2FinalColumns.ToArray());

//  This only matches on USER_NAME now, how do I add in CLIENT?
var rowData = from row1 in table1.AsEnumerable()
              join row2 in table2.AsEnumerable()
              on row1.Field<string>("USER_NAME") equals row2.Field<string>("USER_NAME")
              select row1; 
// This gives me the matched rows in rowData, but I'm not sure how to join it with original table1

最佳答案

要加入多个列,您必须使用匿名类型:

from row1 in table1.AsEnumerable()
join row2 in table2.AsEnumerable() on
  new { userName = row1.Field<string>("USER_NAME"), client = row1.Field<string>("CLIENT") }
equals
  new { userName = row2.Field<string>("USER_NAME"), client = row2.Field<string>("CLIENT") }
select new {
    userName = row1.Field<string>("USER_NAME"),
    client = row1.Field<string>("CLIENT"),
    totalOrders = row2.Field<int>("TOTAL_ORDERS"),
    (...)
}

关于c# - 根据多个条件外部连接两个数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31522337/

相关文章:

C# - 在对象初始化器中使用值两次

c# - 为什么我不能将类库与 Asp.Net 5 MVC 6 项目中的 EF 6.1.3 一起使用

C# 如何编写可以在类实例上调用的类方法

c# - 从一组图像中创建视频

c++ - 将文件组织到文件夹(模块编程)

c# - 未经授权访问 WSS spsearch.asmx

来自 FormCollection 的 C# LINQ 查询/投影

c# - 向 IList<T> 添加动态失败

c# - 如何获取具有指定名称的 DataMemberAttribute 的属性?

c# - Linq 中的索引