2

私は2つのテーブルを持っています:

Customer:                
+------------------------------+
|   ID        |    Address     |
|------------------------------|
|   1         | London, UK     |
|   2         | Paris, France  |
+------------------------------+

Updated Customer:                
+------------------------------+
|   ID        |    Address     |
|------------------------------|
|   1         | Birmingham, UK |
+------------------------------+

この結果を得るためにテーブルをマージするにはどうすればよいですか? :

Customer:                
+------------------------------+
|   ID        |    Address     |
|------------------------------|
|   1         | Birmingham, UK |
|   2         | Paris, France  |
+------------------------------+

ユニオンで試したC#/ Linqコード:

DataTable customer = new DataTable();
customer.Columns.Add("ID", typeof(int));
customer.Columns.Add("Address", typeof(string));

DataTable updatedCustomer = new DataTable();
updatedCustomer.Columns.Add("ID", typeof(int));
updatedCustomer.Columns.Add("Address", typeof(string));

customer.Rows.Add(1, "London, UK");
customer.Rows.Add(2, "Paris, France");

updatedCustomer.Rows.Add(1, "Birmingham, UK");

var cust = from row in customer.AsEnumerable()
select new
{
    ID = row[0],
    Address = row[1]
};

var uCust = from row in updatedCustomer.AsEnumerable()
select new
{
    ID = row[0],
    Address = row[1]
};

var updatedTable = cust.Union(uCust);
//Please use cust and uCust objects, not customer and UpdatedCustomer.

ただし、ユニオンは3行すべてを含むテーブルを提供しています。

4

3 に答える 3

3

IDを比較するだけの独自の比較子を作成できます

public class IDComparer  : IEqualityComparer<DataRow> 
{   
    public bool Equals(DataRow x, DataRow y)
    {           
        return (int) x["ID"] == (int) y["ID"] ;
    }

    public int GetHashCode(DataRow obj)
    {                           
        return (int) obj["ID"] ;
    }               
}           

それを使用するには、

var updatedTable = uCust.Union(cust, new IDComparer ())
于 2013-10-22T09:13:14.607 に答える
2

主キーを追加し、Merge を使用すると、答えが得られます。

    DataTable customer = new DataTable();
    var customerIdColumn = new DataColumn("ID", typeof(int));
    customer.Columns.Add(customerIdColumn);
    customer.Columns.Add("Address", typeof(string));
    customer.PrimaryKey = new[] { customerIdColumn };

    DataTable updatedCustomer = new DataTable();
    var updatedCustomerIdColumn = new DataColumn("ID", typeof(int));
    updatedCustomer.Columns.Add(updatedCustomerIdColumn);
    updatedCustomer.Columns.Add("Address", typeof(string));
    updatedCustomer.PrimaryKey = new[] { updatedCustomerIdColumn };

    customer.Rows.Add(1, "London, UK");
    customer.Rows.Add(2, "Paris, France");

    updatedCustomer.Rows.Add(1, "Birmingham, UK");


    customer.Merge(updatedCustomer, false);

編集

linq でこれを行うには、not in が必要です。わかりやすくするために、これをかなり冗長にしました。ただし、コードをより簡潔にすることはかなり簡単にできるはずです。

var cust = customer.AsEnumerable();
var uCust = updatedCustomer.AsEnumerable();

var newCust = (from c in cust join u in uCust on c.Field<int>("ID") equals u.Field<int>("ID") select u);
var newUCust =
    (from cu in cust where !(from ucu in uCust select ucu.Field<int>("ID")).Contains(cu.Field<int>("ID")) select cu);
var joined = newCust.Concat(newUCust);
于 2013-10-22T08:34:31.493 に答える