Tüm sütunları her iki tablodan da korurken, Dış Tablolara Katılma (Sol Dış Katmandım, ancak% 100 emin değilim) ile ilgili aşağıdaki tablo ve koşullara sahip iki veri tablosunu nasıl kaldırabilirim?Dıştan Nasıl Dış Sol İki DataTable'a C# 'ya katılın?
dtblLeft:
id col1 anotherColumn2
1 1 any2
2 1 any2
3 2 any2
4 3 any2
5 3 any2
6 3 any2
7 any2
dtblRight:
col1 col2 anotherColumn1
1 Hi any1
2 Bye any1
3 Later any1
4 Never any1
dtblJoined:
id col1 col2 anotherColumn1 anotherColumn2
1 1 Hi any1 any2
2 1 Hi any1 any2
3 2 Bye any1 any2
4 3 Later any1 any2
5 3 Later any1 any2
6 3 Later any1 any2
7 any2
Koşullar:
- DtblLeft'de, col1'in benzersiz değerlere sahip olması gerekmez.
- dtblRight'ta col1 benzersiz değerlere sahiptir.
- dtblLeft, col1'de bir yabancı anahtar yoksa veya dtblRight'da bulunmayan bir tanesine sahipse boş veya boş alanlar eklenir.
- col1'e katılma.
Normal DataTable işlemleri kullanabilir, LINQ, ya da her neyse.
Bu çalıştı ama çiftleri kaldırır:dtblA.PrimaryKey = new DataColumn[] {dtblA.Columns["col1"]}
DataTable dtblJoined = new DataTable();
dtblJoined.Merge(dtblA, false, MissingSchemaAction.AddWithKey);
dtblJoined.Merge(dtblB, false, MissingSchemaAction.AddWithKey);
EDIT 1:
Bu ne istiyorum I yakındır ama sadece tablolardan birini (sütunları vardır (bu link numaralı belgede bulunabilir):
dtblJoined = (from t1 in dtblA.Rows.Cast<DataRow>()
join t2 in dtblB.Rows.Cast<DataRow>() on t1["col1"] equals t2["col1"]
select t1).CopyToDataTable();
DÜZENLEME 2: aşağıdaki gibi ben bu link gelen bir cevap benim için çalışmak gibi görünüyor
ama bunu biraz değiştirmek için:
DataTable targetTable = dtblA.Clone();
var dt2Columns = dtblB.Columns.OfType<DataColumn>().Select(dc =>
new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
var dt2FinalColumns = from dc in dt2Columns.AsEnumerable()
where targetTable.Columns.Contains(dc.ColumnName) == false
select dc;
targetTable.Columns.AddRange(dt2FinalColumns.ToArray());
var rowData = from row1 in dtblA.AsEnumerable()
join row2 in dtblB.AsEnumerable()
on row1["col1"] equals row2["col1"]
select row1.ItemArray.Concat(row2.ItemArray.Where(r2 => row1.ItemArray.Contains(r2) == false)).ToArray();
foreach (object[] values in rowData)
targetTable.Rows.Add(values);
Ben de bu link buldum ve beri dikkat deneyebilirsiniz daha özlü görünüyor.
DÜZENLEME 3 (2013/11/18):
daha durumları yansıtmak için tabloları güncellendi.
Bu aynı zamanda doğal birleşimdir. DtblA'nın '4' olması ve dtblB'nin olmaması durumunda ne yapılması gerektiğini bize bildirin. – Shoe
, 4 – Soenhay
ile dtblA'yı güncellemek için güncellendi Sadece aynı sorunla ilgili olarak SO üzerinde bu diğer mesajları kaçırdıysanız [Check here] (http://stackoverflow.com/questions/10404039/left-join-datatables-how-do- Ben bu işe-iş) [ve işte] (http://stackoverflow.com/questions/9055180/datatables-left-join-c-sharp) – Rwiti