2013-04-18 7 views
2

У меня есть 2 datatables с именем 'dst' и 'dst2'. они расположены в наборе данных «urenmat». Мэрность данных находится в 'dst'. это, однако, содержит столбец с именем «werknemer». Он содержит значение, соответствующее определенной строке в 'dst2'. Этот столбец называется «nummer».Запрос 2 данных в наборе данных

То, что мне нужно, - это путь к внешнему соединению, соединяющий оба datatables, где dst.werknemer и dst2.nummer связаны, и создается новый datatable, который содержит 'dst2.naam', связанную с 'dst.werknemer' вместе со всеми другие столбцы из «dst».

Я искал всюду и до сих пор не могу найти правильный ответ на мой вопрос. несколько сайтов предоставляют способ использования LINQ в этой ситуации. Я пробовал использовать LINQ, но я не настолько искусен в этом.

Я попытался с помощью 101 LINQ Samples: http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

urenmat = dataset. 
dst = a, b, c, d, werknemer. 
dst2 = nummer, naam. 

Я использовал следующий код из '101'.

  var query = 
      from contact in dst.AsEnumerable() 
      join order in dst2.AsEnumerable() 
      on contact.Field<string>("werknemer") equals 
      order.Field<string>("nummer") 
      select new 
      { 
       a = order.Field<string>("a"), 
       b = order.Field<string>("b"), 
       c = order.Field<string>("c"), 
       d = order.Field<string>("d"), 
       naam = contact.Field<decimal>("naam")}; 

Я же не знаю, что менять «контакт» и «порядок» к и я не могу показаться, чтобы узнать, как сохранить его в DataTable снова.

Мне очень жаль, если это глупые вопросы, но я попытался решить это сам, но кажется, что я глуп: P. Благодарим за помощь заранее!

PS. Я использую C# для кодирования, набирают набор данных и datatables.

ответ

0

Если вы хотите создать проецируемый набор данных dst left external, соединенный с dst2, вы можете использовать это выражение LINQ (извините, я действительно не работаю в синтаксисе запроса LINQ, поэтому вам придется использовать этот синтаксис лямбда).

var query = dst.AsEnumerable() 
    .GroupJoin(dst2.AsEnumerable(), x => x.Field<string>("werknemer"), x => x.Field<string>("nummer"), (contact, orders) => new { contact, orders }) 
    .SelectMany(x => x.orders.DefaultIfEmpty(), (x, order) => new 
    { 
     a = order.Field<string>("a"), 
     b = order.Field<string>("b"), 
     c = order.Field<string>("c"), 
     d = order.Field<string>("d"), 
     naam = x.contact.Field<decimal>("naam") 
    }); 

, потому что это проецируется набор данных, вы не можете просто сохранить обратно в DataTable. Если требуется сохранение, вам нужно загрузить затронутую строку, обновить нужные поля и сохранить изменения.

// untyped 
var row = dst.Rows.Find(keyValue); 
// typed 
var row = dst.FindBy...(keyValue); 

// update the field 
row.SetField("a", "some value"); 
// save only this row's changes 
row.AcceptChanges(); 

// or after all changes to the table have been made, save the table 
dst.AcceptChanges(); 

Обычно, если вам необходимо выполнить загрузку и сохранение (проектируемой) данных, ОРМ (например, рамки сущности или LINQ к SQL) будет лучшим инструментом. Тем не менее, вы используете DataTable в этом случае, и я не уверен, что вы можете связать ORM с ними (хотя похоже, что это будет возможно).

Смежные вопросы