数据表中的常用行和新行

时间:2011-07-29 06:44:28

标签: c# .net asp.net sql-server windows

我有两个dataTable,如下所示

1)dtExistingZipCodeInDB(来自数据库的数据)

2)dtCSVExcelSource(来自csv源的数据待处理)

我有两个要求

1)列出所有已退役的邮政编码(dtExistingZipCodeInDB中存在但不包含在dtCSVExcelSource中的邮政编码)

2)UnChanged邮政编码(dtExistingZipCodeInDB和dtCSVExcelSource中都有的邮政编码)

我可以使用Merge来获取已退役的邮政编码。如何获取未更改的邮政编码?

框架:.Net 3.0

//Note: dtExistingZipCodeInDB and dtCSVExcelSource has the same columns
dtCSVExcelSource.Merge(dtExistingZipCodeInDB);
DataTable dtRetiredZipDataTable = dtCSVExcelSource.GetChanges();
string retiredZipCodes = GetStringFromDataTable(dtRetiredZipDataTable, "ZipCode");

由于

Lijo

1 个答案:

答案 0 :(得分:2)

对于.NET 3.0的要求,Intersect LINQ扩展方法不可用,但您可以提供自己的扩展方法。

您所需的所有需要MatchingRows扩展方法(请参阅下面的演示代码),然后执行:

 IEnumerable<DataRow> unchangedZipCodes = dtExistingZipCodeInDB.MatchingRows(dtCSVExcelSource, "ZipCode");

然后你可以遍历未更改的ZipCodes,它只包含dtExistingZipCodeInDB和dtCSVExcelSource之间共同的ZipCodes行。

下面是我使用LINQPad编写的演示代码。我喜欢LINQPad - 这对于概念验证或快速填充/打包一些代码非常有用。但是对于这个问题的解决方案并不是 required

void Main()
{
    string colname = "ZipCode";

    var dt = new DataTable();
    dt.Columns.Add(colname, typeof(string));
    dt.Rows.Add(new [] { "12345" } );
    dt.Rows.Add(new [] { "67890" } );
    dt.Rows.Add(new [] { "40291" } );

    var dt2 = new DataTable();
    dt2.Columns.Add(colname, typeof(string));
    dt2.Rows.Add(new [] { "12345" } );
    dt2.Rows.Add(new [] { "83791" } );
    dt2.Rows.Add(new [] { "24520" } );
    dt2.Rows.Add(new [] { "48023" } );
    dt2.Rows.Add(new [] { "67890" } );

/// With .NET 3.5 LINQ extensions, it can be done inline.
//  var results = dt.AsEnumerable()
//          .Select(r => r.Field<string>(colname))
//          .Intersect(dt2.AsEnumerable()
//              .Select(r => r.Field<string>(colname)));
//  Console.Write(String.Join(", ", results.ToArray()));

    var results = dt.MatchingRows(dt2, colname);
    foreach (DataRow r in results)
        Console.WriteLine(r[colname]);
}

public static class Extensions
{
    /// With .NET 3.0 and no LINQ, create an extension method using yield.
    public static IEnumerable<DataRow> MatchingRows(this DataTable dt, DataTable dtCompare, string colName)
    {
        foreach (DataRow r in dt.Rows)
        {
            if (dtCompare.Select(String.Format("{0} = {1}", colName, r[(colName)])).Length > 0)
                yield return r;
        }
    }
}

输出:

    12345
    67890