[asp.net]共同和数据表中的新行

发布时间: 2016/7/21 5:39:15
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有两个数据表,如下所示

1) dtExistingZipCodeInDB (数据库中的数据)

2) dtCSVExcelSource (从 csv 源是要处理的数据)

我有两个要求

1) 列出所有的退休的 zip 代码 (而不是在 dtCSVExcelSource dtExistingZipCodeInDB 中存在的 zip 代码)

2) 不变 zip 代码 (目前在 dtExistingZipCodeInDB 和 dtCSVExcelSource 的 zip 代码)

我可以使用合并得到退休的邮递区号。我不变的 zip 代码是怎么来的?

框架︰.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:

随着要求的.NET 3.0,相交的 LINQ 扩展方法不可用,但您可以提供您自己的扩展方法。

所有需要是 MatchingRows 扩展方法 (见下文中演示代码),然后执行︰

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

然后,您可以遍历 unchangedZipCodes,将只包含那些行与按时区 dtExistingZipCodeInDB 和 dtCSVExcelSource 之间的共同之处。

下面是我写了使用 LINQPad 的演示代码。我爱LINQPad — — 它是伟大的概念或 scratchpadding/沙盒一些代码快速的证明。但它不是需要对这个问题的解答。

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
赞助商