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

如何在c#中左外连接两个数据表?Share

时间:2023-04-10 23:55:40 C#

C#中如何左外连接两个数据表?如何维护具有以下表和条件的两个数据表的左外连接(我认为这是左外连接,但我不是100%确定),同时保留两个表中的所有列?dtblLeft:idcol1anotherColumn211any221any232any243any253any263any27any2dtblRight:col1col2anotherColumn11你好any12再见any13后来any14从不any1dtblColumn21canool1col21你好any1any221你好any1any232再见any1any243稍后any1any253稍后any1any263稍后any1any27any2条件:我可以使用正常的DataTable操作、LINQ或其他任何操作。我试过了,但它删除了重复项:dtblA.PrimaryKey=newDataColumn[]{dtblA.Columns["col1"]}DataTabledtblJoined=newDataTable();dtblJoined.Merge(dtblA,false,MissingSchemaAction.AddWithKey);dtblJoined.Merge(dtblB,false,MissingSchemaAction.AddWithKey);编辑1:这接近我想要的,但它在表中只有一列(在此链接中找到):t1["col1"]等于t2["col1"]选择t1).CopyToDataTable();编辑2:此链接的答案似乎对我有用,但我不得不更改如下:DataTabletargetTable=dtblA.Clone();vardt2Columns=dtblB.Columns.OfType().Select(dc=>newDataColumn(dc.ColumnName,dc.DataType,dc.Expression,dc.ColumnMapping));vardt2FinalColumns=fromdcindt2Columns.AsEnumerable()wheretargetTable.Columns.Contains(dc.ColumnName)==falseselectdc;targetTable.Columns.AddRange(dt2FinalColumns.ToArray());varrowData=fromrow1indtblA.AsEnumerable()joinrow2indtblB.AsEnumerable()onrow1["col1"]等于row2["col1"]selectrow1.ItemArray.Concat(row2.ItemArray.Where(r2=>row1.ItemArray.Contains(r2)==false)).ToArray();foreach(object[]valuesinrowData)targetTable.Rows.Add(values);我也找到了这个链接,我可能会尝试它,因为它看起来更简洁编辑3(11/18/2013):更新表格以反映更多。感谢您的帮助。以下是我基于多种资源提出的建议:publicstaticclassDataTableHelper{publicenumJoinType{//////与常规连接相同。内部联接仅生成同时在表A和表B中匹配的记录集。///Inner=0,//////与左外部联接相同。左外部联接从表A中生成一组完整的记录,并在表B中生成匹配的记录(如果可用)。如果没有匹配项,则右侧将包含空值。///Left=1}//////在colToJoinOn上加入传入的数据表。///如果colToJoinOn在两个表中都不存在,则返回具有零行的适当数据表。////////////////////////http://stackoverflow.com/questions/2379747/create-combined-datatable-from-two-datatables-joined-with-linq-c-sharp?rq=1///http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx///http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html///http://stackoverflow.com/questions/406294/left-join-and-left-outer-join-in-sql-server///publicstaticDataTableJoinTwoDataTablesOnOneColumn(DataTabledtblLeft,DataTabledtblRight,stringcolToJoinOn,JoinTypejoinType){//将列名称更改为临时名称,以便LINQ获取行数据将正常工作。字符串strTempColName=colToJoinOn+"_2";如果(dtblRight.Columns.Contains(colToJoinOn))dtblRight.Columns[colToJoinOn].ColumnName=strTempColName;//从dtblLeft数据表中获取列dtblResult=dtblLeft.Clone();//从dtblRight中获取列vardt2Columns=dtblRight.Columns.OfType().Select(dc=>newDataColumn(dc.ColumnName,dc.DataType,dc.Expression,dc.ColumnMapping));//从dtblRight中获取不在dtblLeft中的列vardt2FinalColumns=fromdcindt2Columns.AsEnumerable()where!dtblResult.Columns.Contains(dc.ColumnName)selectdc;//将其余列添加到dtblResultdtblResult.Columns.AddRange(dt2FinalColumns.ToArray());//没有理由继续如果colToJoinOn在两个数据表中都不存在。如果(!dtblLeft.Columns.Contains(colToJoinOn)||(!dtblRight.Columns.Contains(colToJoinOn)&&!dtblRight.Columns.Contains(strTempColName))){如果(!dtblResult.Columns.Contains(colToJoinOn))dtblResult。Columns.Add(colToJoinOn);返回dtblResult;}switch(joinType){default:caseJoinType.Inner:#regionInner//获取行数据//要使用DataTable.AsEnumerable()扩展方法,您需要在项目中添加对System.Data.DataSetExtension程序集的引用.varrowDataLeftInner=fromrowLeftindtblLeft.AsEnumerable()joinrowRightindtblRight.AsEnumerable()onrowLeft[colToJoinOn]equalsrowRight[strTempColName]selectrowLeft.ItemArray.Concat(rowRight.ItemArray).ToArray();//向dtblResult添加行数据foreach(object[]valuesinrowDataLeftInner)dtblResult.Rows.Add(values);#endregion中断;caseJoinType.Left:#regionLeftvarrowDataLeftOuter=fromrowLeftindtblLeft.AsEnumerable()joinrowRightindtblRight.AsEnumerable()onrowLeft[colToJoinOn]等于rowRight[strTempColName]从subRightingj.DefaultIfEmpty()到gjselectrowLeft.ItemArray.Concat((subRight==null)?(dtblRight.NewRow().ItemArray):subRight.ItemArray).ToArray();//向dtblResult添加行数据foreach(object[]valuesinrowDataLeftOuter)dtblResult.Rows.Add(values);#endregion中断;}//将列名改回原来的dtblRight.Columns[strTempColName].ColumnName=colToJoinOn;//从结果中删除多余的列dtblResult.Columns.Remove(strTempColName);返回dtblResult;编辑3:这个方法现在工作正常,当表有超过2000行时,它仍然很快任何建议/建议/改进将不胜感激。编辑4:我有一个特定的场景让我意识到以前的版本确实在进行内部连接。该函数已被修改以解决此问题。我使用此链接上的信息来弄清楚。这只是两个表之间的内部连接:varquery=(fromxina.AsEnumerable()joinyinb.AsEnumerable()onx.Field("col1")equalsy.Field("col1")selectnew{col1=y.Field("col1"),col2=x.Field("col2")}).ToList();产生:col1col21Hi1Hi2Bye3Later3Later3Later您可以使用LINQ并执行以下操作:vardtblJoined=fromdBindtblB.AsEnumerable()joindAindtblA.AsEnumerable()ondA.col1equalsdB.col1从dindAB.DefaultIfEmpty()selectnew(col1=dB.col1,;col2=(dB.col1==dA.col1)?dA.col2:null);这将返回一个IEnumerable,因为结果不是DataTable,但它应该让你更接近你想要的。可能需要稍微调整一下。以上是C#学习教程:如何在c#中左外连接两个DataTables?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: