有没有一种简单的方法可以在C#中内部联接、外部联接、左外部联接、右外部联接或并集两个(或更多)数据表?

有没有一种简单的方法可以在C#中内部联接、外部联接、左外部联接、右外部联接或并集两个(或更多)数据表?,c#,.net,join,datatable,C#,.net,Join,Datatable,我正在编写一个连接不同数据库系统的c#应用程序。这些系统可以是平面文件数据库、Oracle、Sql、Excel文件、ext。C#应用程序的任务是提供一个出口,使所有这些源在一个位置可用。因此,基本上,应用程序接受相应数据库系统的查询和连接设置列表,并收集一组结果 目标是输出一个单一的数据表,其中包含所有这些查询的结果,这些查询都合并/联合在一起(取决于设置)。C#是否提供了一种对数据表列表执行任何联接/联合操作的简单方法 例如: Table1: _________________________

我正在编写一个连接不同数据库系统的c#应用程序。这些系统可以是平面文件数据库、Oracle、Sql、Excel文件、ext。C#应用程序的任务是提供一个出口,使所有这些源在一个位置可用。因此,基本上,应用程序接受相应数据库系统的查询和连接设置列表,并收集一组结果

目标是输出一个单一的数据表,其中包含所有这些查询的结果,这些查询都合并/联合在一起(取决于设置)。C#是否提供了一种对数据表列表执行任何联接/联合操作的简单方法

例如:

Table1:
__________________________________________________________
|tb1_pk_id|   tb1_name    |   tb1_data1   |   tb1_data2   |
|---------|---------------|---------------|---------------|
|    1    | tb1name_blah1 | tb1dat1_blah1 | tb1dat2blah1  |
|    2    | tb1name_blah2 | tb1dat1_blah2 | tb1dat2blah2  |
|    3    | tb1name_blah3 | tb1dat1_blah3 | tb1dat2blah3  |
----------------------------------------------------------- 

Table2:
__________________________________________________________
|tb2_pk_id|   tb2_name    |   tb2_data1   |   tb2_data2   |
|---------|---------------|---------------|---------------|
|    1    | tb2name_blah1 | tb2dat1_blah1 | tb2dat2blah1  |
|    2    | tb2name_blah2 | tb2dat1_blah2 | tb2dat2blah2  |
|    3    | tb2name_blah3 | tb2dat1_blah3 | tb2dat2blah3  |
----------------------------------------------------------- 

Join Results:
__________________________________________________________ _______________________________________________
|tb1_pk_id|   tb1_name    |   tb1_data1   |   tb1_data2   |   tb2_name    |   tb2_data1   |   tb2_data2   |
|---------|---------------|---------------|---------------|---------------|---------------|---------------|
|    1    | tb1name_blah1 | tb1dat1_blah1 | tb1dat2blah1  | tb2name_blah1 | tb2dat1_blah1 | tb2dat2blah1  |
|    2    | tb1name_blah2 | tb1dat1_blah2 | tb1dat2blah2  | tb2name_blah2 | tb2dat1_blah2 | tb2dat2blah2  |
|    3    | tb1name_blah3 | tb1dat1_blah3 | tb1dat2blah3  | tb2name_blah3 | tb2dat1_blah3 | tb2dat2blah3  |
-----------------------------------------------------------------------------------------------------------   
到目前为止,我在网上找到了以下代码(),用于对所有数据进行合并:

private DataTable MergeAll(IList<DataTable> tables, String primaryKeyColumn)
        {
            if (!tables.Any())
                throw new ArgumentException("Tables must not be empty", "tables");
            if (primaryKeyColumn != null)
                foreach (DataTable t in tables)
                    if (!t.Columns.Contains(primaryKeyColumn))
                        throw new ArgumentException("All tables must have the specified primarykey column " + primaryKeyColumn, "primaryKeyColumn");

            if (tables.Count == 1)
                return tables[0];

            DataTable table = new DataTable("TblUnion");
            table.BeginLoadData(); // Turns off notifications, index maintenance, and constraints while loading data
            foreach (DataTable t in tables)
            {
                table.Merge(t); // same as table.Merge(t, false, MissingSchemaAction.Add);
            }
            table.EndLoadData();

            if (primaryKeyColumn != null)
            {
                // since we might have no real primary keys defined, the rows now might have repeating fields
                // so now we're going to "join" these rows ...
                var pkGroups = table.AsEnumerable()
                    .GroupBy(r => r[primaryKeyColumn]);
                var dupGroups = pkGroups.Where(g => g.Count() > 1);
                foreach (var grpDup in dupGroups)
                {
                    // use first row and modify it
                    DataRow firstRow = grpDup.First();
                    foreach (DataColumn c in table.Columns)
                    {
                        if (firstRow.IsNull(c))
                        {
                            DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c));
                            if (firstNotNullRow != null)
                                firstRow[c] = firstNotNullRow[c];
                        }
                    }
                    // remove all but first row
                    var rowsToRemove = grpDup.Skip(1);
                    foreach (DataRow rowToRemove in rowsToRemove)
                        table.Rows.Remove(rowToRemove);
                }
            }

            return table;
        }
私有数据表MergeAll(IList表,字符串primaryKeyColumn)
{
如果(!tables.Any())
抛出新ArgumentException(“表不能为空”、“表”);
if(primaryKeyColumn!=null)
foreach(表中的数据表t)
如果(!t.Columns.Contains(primaryKeyColumn))
抛出新ArgumentException(“所有表必须具有指定的primarykey列”+primaryKeyColumn,“primaryKeyColumn”);
如果(tables.Count==1)
返回表[0];
DataTable=新的DataTable(“TblUnion”);
table.BeginLoadData();//在加载数据时关闭通知、索引维护和约束
foreach(表中的数据表t)
{
table.Merge(t);//与table.Merge(t,false,MissingSchemaAction.Add)相同;
}
table.EndLoadData();
if(primaryKeyColumn!=null)
{
//因为我们可能没有定义真正的主键,所以现在的行可能有重复的字段
//现在我们要“加入”这些行。。。
var pkGroups=table.AsEnumerable()
.GroupBy(r=>r[primaryKeyColumn]);
var dupGroups=pkGroups.Where(g=>g.Count()>1);
foreach(两组中的var grpDup)
{
//使用第一行并修改它
DataRow firstRow=grpDup.First();
foreach(表.Columns中的数据列c)
{
如果(第一行为空(c))
{
DataRow firstNotNullRow=grpDup.Skip(1).FirstOrDefault(r=>!r.IsNull(c));
if(firstNotNullRow!=null)
firstRow[c]=firstNotNullRow[c];
}
}
//删除除第一行以外的所有行
var rowsToRemove=grpDup.Skip(1);
foreach(数据行rowToRemove在rowToRemove中)
table.Rows.Remove(rowToRemove);
}
}
返回表;
}

这对于进行联合很好,但我不知道.NET中是否已经存在一种更简单的方法,可以让我对一组seprate数据表(不仅仅是上面代码中的联合)进行任何类型的联合或联合,或者我必须对每种类型的联合/联合进行自定义编码

不,没有一种简单的.Net方法可以做到这一点

林克可以接近。。。您可以在LINQ中创建表联接,但它们通常是“内部联接”。执行“左连接”有点复杂,需要
GroupJoin
关键字。

如果您想使用ADO.Net DataRelations“自己动手”,可以看看这篇旧的VB.Net文章:


我觉得情况就是这样,我只是想确保自己没有遗漏什么。我将研究使用LINQ方法。非常感谢。