2012-05-01 4 views
0

Я пытаюсь понять, как запросить, желательно с LINQ, 2 datatables. Я хотел бы сделать LEFT OUTER JOIN на нихLEFT OUTER JOIN 2 datatables

Datatable1 с цв-х: [ID] [КОЛА]
DataTable2 с цв-х: [ID] [ColB] [ColC] ...

Заглядывая присоединитесь к этому идентификатору.

Может кто-нибудь, пожалуйста, покажите мне пример, чтобы я мог применить его к данным, которые у меня есть? Спасибо заранее

+0

Вы пробовали это: http://msdn.microsoft.com/en-us/library/bb311040.aspx или это даже: http://stackoverflow.com/questions/5388969/join-two-tables- in-linq-to-sql –

ответ

3

компилируется и делает то, что вы бы рассчитывать на основании полученного результата:

// create the default row to be used when no value found 
var defaultRow = DataTable2.NewRow(); 
defaultRow[0] = 0; 
defaultRow[1] = String.Empty; 

// the query 
var result = from x in DataTable1.AsEnumerable() 
    join y in DataTable2.AsEnumerable() on (string)x["ID"] equals (string)y["ID"] 
      into DataGroup 
    from row in DataGroup.DefaultIfEmpty<DataRow>(defaultRow) 
    select new {a = x["ColA"], b = (string)row["ColB"]}; 
+0

Похоже, что это сработает, и я пытаюсь это сделать сейчас. Моя программа занимает некоторое время, чтобы сначала заполнить базы данных, но я отправлю отчет после завершения. Большое вам спасибо за помощь! – Kyle

0

Чтобы получить внутреннее соединение попробовать это

from x in Datatable1 
join y in Datatable2 on x.ID equals y.ID 
select new {x.colA, y.ColB, y.ColC } 
+1

Я предполагаю, что часть того, что меня смущает на вашем примере, и все примеры elses, для меня нет x.ID. Должен ли быть x.ID? или я должен делать что-то вроде x.Table.Columns ["ID"] вместо x.ID? Что я могу делать неправильно, что я не получаю X.ID? Спасибо за помощь. – Kyle

2

Чтобы получить LEFT OUTER Join

и вы должны попробовать использовать @Joanna ссылку.

from x in DataTable1 
join y in DataTable2 on x.ID equals y.ID into DataGroup 
from item in DataGroup.DefaultIfEmpty(new y.ColB = String.Empty , y.ColC = String.Empty}) 
select new {x.ColA, item.ColB , item.ColC} 

UPDATE

Учитывая то, что вы обеспечиваете вы должны искать LINQ-Dataset статей

Вот фрагмент кода

DataTable DataTable1 = new DataTable(); 
DataTable DataTable2 = new DataTable(); 

DataTable1.Columns.Add("ID"); 
DataTable1.Columns.Add("ColA"); 
DataTable1.Rows.Add(1, "A"); 
DataTable1.Rows.Add(2, "B");  

DataTable2.Columns.Add("ID"); 
DataTable2.Columns.Add("ColB"); 
DataTable2.Rows.Add(1, "B"); 

var result = from x in DataTable1.AsEnumerable() 
      join y in DataTable2.AsEnumerable() on x["ID"] equals y["ID"] into DataGroup       
      from item in DataGroup.DefaultIfEmpty() 
      select new { 
          ID = x["ID"], 
          ColA = x["ColA"], 
          ColB = item == null ? string.Empty : item["ColB"] 
         }; 
foreach (var s in result) 
    Console.WriteLine("{0}", s); 
+0

Я предполагаю, что часть того, что меня смущает на вашем примере, и все примеры elses - для меня нет x.ID. Должен ли быть x.ID? или мне нужно делать что-то вроде x.Table.Columns ["ID"] вместо x.ID? Что я могу делать неправильно, что я не получаю X.ID? Благодарим за помощь. – Kyle

+0

Что вы сделали до сих пор? можете ли вы рассказать нам больше, почему вы не получаете x.ID? – Turbot

+0

Например, вот код с самого начала, чтобы попытаться как можно ближе соответствовать вашим. http://codepaste.net/ic84es Если я не использую .AsEnumerable(), то это дает мне ошибку в DataTable1, поскольку GroupJoin не найден. ЕСЛИ я добавляю AsEnumerable(), который один из примеров, который я нашел во время поиска, показал, что нужно делать для datatables, следующая ошибка X.ID, потому что нет .ID. Я просто получаю то, что нормально для DataRow. Еще раз благодарю вас за помощь. – Kyle