比较两列List<>基于第一列

时间:2017-11-21 21:05:25

标签: c# sql list sqldatareader

我尝试使用C#将两个SQL数据库进行比较。 我将第一个数据库中的字段列表存储在两列列表中。 我如何将一列中的两列匹配到另一列?两个数据库都输出列表,后面两列完全相同(CustNo,CustName)。

CustNo是主键,因此我想遍历所有CustNo字段并查找CustName是否已更改。

using static ESLBlackBox.MasterReport;

class Program
{
    static void Main(string[] args)
    {
        Program program = new Program();

        var changed = program.ReadNewMasterReport()
            .Where(b => program.ReadOldMasterReport()
            .Any(a => a.custNo == b.custNo && a.custName != b.custName))
            .ToList();

        Console.WriteLine(changed);
    }

    public List<Fields> ReadOldMasterReport()
    {
        SqlDataReader rdr = null;
        SqlConnection conn = new SqlConnection("Data Source=ESLAXSQLDEV1;Initial Catalog=ESLBlackBox;Integrated Security=True");
        SqlCommand cmd = new SqlCommand("select * from Master_Report", conn);
        List<Fields> oldResult = new List<Fields>();

        try
        {
            using (conn)
            {
                conn.Open();
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader != null && reader.Read())
                    {
                        oldResult.Add(new Fields
                        {
                            custNo = Convert.ToString(reader["Service Address Cust No"]),
                            custName = Convert.ToString(reader["Service Address Acct Name"])
                        });
                    }
                }
            }
        }
        finally
        {
            if (rdr != null)
            {
                rdr.Close();
            }

            if (conn != null)
            {
                conn.Close();
            }
        }
        return oldResult;
    }

MasterReport Class

class MasterReport
{
    public class Fields
    {
        public string custNo { get; set; }
        public string custName { get; set; }
    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用linq:

var changed = listB
    .Where(b => listA
        .Any(a => a.custNo == b.custNo && a.custName != b.custName))
    .ToList();

答案 1 :(得分:0)

由于两个DB位于同一服务器上,因此您可以执行跨数据库连接以找出差异。

SELECT tb1.CustNo, tb1.CustName, tb2.CustName FROM db1.dbo.Master_Report tb1 INNER JOIN db2.dbo.Master_Report tb2 ON tb1.CustNo = tb2.CustNo WHERE tb1.CustName != tb2.CustName;
通过这种方式,您可以避免加载数十万个条目并在内存中进行比较。数据库将为您完成肮脏的工作。