当前位置: 首页 > 编程语言 > C#

全外连接,在2个数据表上,带有列列表分享

时间:2023-04-10 12:58:00 C#

C#学习教程:FullOuterJoin,On2DataTables,WithColumnList此列表必须在运行时提取并用于完整的外部连接。使用这些列时,需要合并两个表之间的列,我需要显示所有数据。到目前为止,我正在做的是使用intersect获取公共列并实施IEqualityComparer以创建包含这些列的新数据表,以便将2个数据表合并到这个新表中,但是,我在第二个Linq上遇到问题步。到现在为止,我有:获取公共列//获取公共列varcommonColumns=dt1.Columns.OfType()。相交(dt2.Columns.OfType(),新DataColumnComparer());CreatenewDataTable//创建将发送给用户的结果DataTableresult=newDataTable();//添加两个表中的所有列result.Columns.AddRange(dt1.Columns.OfType().Union(dt2.Columns.OfType(),newDataColumnComparer()).Select(c=>newDataColumn(c.Caption,c.DataType、c.Expression、c.ColumnMapping))。ToArray());如何从运行时提取的数据列表中动态获取有效的全外连接?这可能对你有用varcommonColumns=dt1.Columns.OfType().Intersect(dt2.Columns.OfType(),newDataColumnComparer());数据表结果=新数据表();dt1.PrimaryKey=commonColumns.ToArray();result.Merge(dt1,false,MissingSchemaAction.AddWithKey);结果.Merge(dt2,false,MissingSchemaAction.AddWithKey);根据Matthew的回答,我创建了一个接受2个以上数据表的函数。希望对您有所帮助:用法:vartable123=FullOuterJoinDataTables(table1,table2,table3);这是函数源代码:publicDataTableFullOuterJoinDataTables(paramsDataTable[]datatables)//支持您需要的尽可能多的数据表。{DataTable结果=datatables.First().Clone();varcommonColumns=result.Columns.OfType();foreach(vardtindatatables.Skip(1)){commonColumns=commonColumns.Intersect(dt.Columns.OfType(),newDataColumnComparer());}result.PrimaryKey=commonColumns.ToArray();foreach(vardtindatatables){result.Merge(dt,false,MissingSchemaAction.AddWithKey);}返回结果;}/*也创建这个类*/publicclassDataColumnComparer:IEqualityComparer{publicboolEquals(DataColumnx,DataColumny)=>x.Caption==y.Caption;publicintGetHashCode(DataColumnobj)=>obj.Caption.GetHashCode();我也在努力寻找答案,我正在复制粘贴整个代码。我相信这会对你有所帮助。您只需要DataTable1、DataTable2和将在其上执行此联接的两个表的主键。可以设置数据表的主键为datatable1.PrimaryKey=newDataColumn[]{captureDT.Columns["YourKeyName"]};//你上面的代码是C#学习教程:fullouterjoin,on2datatables,列表共享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望你会多加注意—//////将两个数据表的数据合并为一个数据表。表的分组///将基于为两个表提供的主键。//////////////////privateDataTableDataTablesOuterJoin(DataTabletable1,DataTabletable2,stringtable1PrimaryKey,stringtable2PrimaryKey){DataTableflatDataTable=newDataTable();foreach(table2.Columns中的DataColumn列){flatDataTable.Columns.Add(newDataColumn(column.ToString()));}foreach(table1.Columns中的DataColumn列){flatDataTable.Columns.Add(newDataColumn(column.ToString()));}//重新运行包含所需列的空表以生成空提取物(table1PrimaryKey).Trim().ToLower()},(baseRow,joinRow)=>joinRow.DefaultIfEmpty().Select(row=>new{flatRow=baseRow.ItemArray.Concat((row==null)?newobject[table1.Columns.Count]:row.ItemArray).ToArray()})).SelectMany(s=>s);vardataBaseTable1=table1.AsEnumerable();vargroupDataT1toT2=dataBaseTable1.GroupJoin(table2.Select(),br=>new{id=br.Field(table1PrimaryKey).Trim().ToLower()},jr=>new{id=jr.Field(table2PrimaryKey).Trim().ToLower()},(baseRow,joinRow)=>joinRow.DefaultIfEmpty().Select(row=>new{flatRow=(row==null)?newobject[table2.Columns.Count].ToArray().Concat(baseRow.ItemArray).ToArray():row.ItemArray.Concat(baseRow.ItemArray).ToArray()})).SelectMany(s=>s);//获取两组数据的并集到单个集合groupDataT2toT1=groupDataT2toT1.Union(groupDataT1toT2);//将分组数据加载到新创建的表中foreach(varresultingroupDataT2toT1){flatDataTable.LoadDataRow(result.flatRow,false);}//仅获取不同的行IEnumerablerows=flatDataTable.Select().Distinct(DataRowComparer.Default);//创建一个与flatDataTableDataTable具有相同结构的新的不同表distinctFlatDataTable=flatDataTable.Clone();distinctFlatDataTable.Rows.Clear();//将所有行推送到不同的表中。//注意:主键1和主键2会有两个不同的列。在分组行中,//primarykey1或primarykey2可以有空值。因此,仅当主键1值为空时,才将所有主键2值复制到//主键1,然后删除主键2。所以最后//我们只会得到一个主键。请确保未删除的键必须存在于foreach(DataRowrowinrows){if(string.IsNullOrEmpty(row[table1PrimaryKey].ToString()))row[table1PrimaryKey]=row[table2PrimaryKey];如果(string.IsNullOrEmpty(row[CaptureBusDateColumn].ToString()))row[CaptureBusDateColumn]=_businessDate;如果(字符串.IsNullOrEmpty(row[CaptureUserIDColumn].ToString()))row[CaptureUserIDColumn]=row[StatsUserIDColumn];distinctFlatDataTable.ImportRow(行);}//根据主键对表进行排序。DataTablesortedFinaltable=(fromorderRowindistinctFlatDataTable.AsEnumerable()orderbyorderRow.Field(table1PrimaryKey)selectorderRow).CopyToDataTable();//删除主键2,因为我们已经将其复制到主键1sortedFinaltable.Columns.Remove(table2PrimaryKey);返回ReplaceNulls(sortedFinaltable,"0");}//////用指定字符串替换数据表中的所有空值////////////privateDataTableReplaceNulls(DataTabledt,stringreplaceStr){for(inta=0;a本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: