2015-04-21 2 views
1

У меня есть datatable named, который содержит данные со столбцом с идентификатором, именем, фамилией. Другой datatable содержит столбцы кода, userID1, userID2, userID3, работа.Присоединиться к DataTables для получения нового DataTable через LINQ

Теперь я хочу новый datatable, который должен содержать столбец как данных с соответствующими данными.

Новые данные должны содержать данные как: ID, userfullname1, userfullname2, userfullname3, работа.

Здесь мы получаем значение userfullname1 по FirstName, LastName из datatable1 & userID1 из datatable2. Точно так же мы получаем значение userfullname2 по FirstName, LastName из datatable1 & userID2 из datatable2 & так далее.

Значение ID в Datatable1 такой же, как userID1, userID2, userID3 в Datatable2.

Наконец, я хочу получить новый тип данных с кодом, userfullname1, userfullname2, userfullname3, work. Но идентификаторы пользователей находятся в datatable1. Таким образом, я хочу связать имена Datatable1 со всеми 3 userid Datatable2 через их идентификаторы, которые присутствуют в обеих таблицах.

Datatable1:

iD name 
1 b 
2 d 
3 f 
4 s 

....

Datatable2:

Code  userid1 userid2  userid3 work 
    1f   1   3   6  gg 
    2g   1   4   7  gg 
    3b   3   4   7  gg 
    4v   4   3   8  gg 

Новый Datatable:

Code username1 username2 username3 work 
1f   a   b   c  gg 
2g   d   f   r  gg 
3b   c   h   g  gg 
4v   d   s   h  gg 

Как я могу присоединиться к & получить новый datatab le?

+0

Но таблицы, которые вы показываете сейчас, отличаются от того, что вы упомянули в вопросе, не так ли?Например: _ "userID1, userID2, userID3 в Datatable2" _ или _ "ID, firstname, lastname в Datatable1" _ Также неясно, как связаны эти таблицы, кажется, что вы ошибаетесь, что вы упомянули здесь: _ "value ID в Datatable1 совпадает с userID1, userID2, userID3 в Datatable2 "_ –

ответ

2

Похоже, у вас есть таблица с идентификаторами пользователя, и вы хотите присоединиться к своей таблице профилей, чтобы получить эти имена. Вы можете сделать это с помощью подзапросов, как:

var myTable = UserIds.Select(u => new 
{ 
    User1FullName = u.UserProfiles.FirstOrDefault(p => p.UserId == u.userId1).Select(p => p.FirstName + " " + p.LastName), 
    User2FullName = u.UserProfiles.FirstOrDefault(p => p.UserId == u.userId2).Select(p => p.FirstName + " " + p.LastName) 
    // etc... 
}); 

Вы можете сделать это с соединениями типа:

var myTable = (from u in UserIds 
       join p1 in UserProfiles on u.UserId1 equals p1.UserId 
       join p2 in UserProfiles on u.UserId2 equals p2.UserId 
       // etc... 
       select new 
       { 
        User1FullName = p1.FirstName + " " + p1.LastName, 
        User2FullName = p2.FirstName + " " + p2.LastName, 
        // etc... 
       }); 
+0

Я не понял, что такое' UserIds' в вашем коде. Это datarow от datatable2? Нужно ли вводить синтаксис linq в цикле, чтобы получить все 3 имени из каждой строки из datatable1? –

+0

Мое предположение заключалось в том, что у вас есть две таблицы, одна из которых содержит имена, а другая таблица содержит только идентификаторы пользователей и некоторые другие данные. Чтобы получить имена на основе идентификаторов пользователей, я покажу вам, как выполнять подзапрос и соединение. Никакой цикл не требуется. Просто поместите контрольную точку в свой код, чтобы увидеть результаты переменной запроса myTable. – user1477388

2

Вы можете использовать LINQ для достижения того, что вы хотите:

DataTable tblResult = new DataTable(); 
tblResult.Columns.Add("ID"); 
tblResult.Columns.Add("userfullname1"); 
tblResult.Columns.Add("userfullname2"); 
tblResult.Columns.Add("userfullname3"); 
tblResult.Columns.Add("Work"); 

var query = from r1 in datatable1.AsEnumerable() 
      from r2 in datatable2.AsEnumerable() 
      let id = r1.Field<int>("ID") 
      let userID1 = r2.Field<int>("userID1") 
      let userID2 = r2.Field<int>("userID2") 
      let userID3 = r2.Field<int>("userID3") 
      where id == userID1 && id == userID2 && id == userID3 
      select new { r1, r2, id, userID1, userID2, userID3 }; 
foreach (var x in query) 
{ 
    DataRow row = tblResult.Rows.Add(); 
    string firstName = x.r1.Field<string>("firstname"); 
    string lastName = x.r1.Field<string>("lastname"); 
    string userfullname1 = string.Format("{0} {1} {2}", firstName, lastName, x.userID1); 
    string userfullname2 = string.Format("{0} {1} {2}", firstName, lastName, x.userID2); 
    string userfullname3 = string.Format("{0} {1} {2}", firstName, lastName, x.userID3); 
    row.SetField("ID", x.id); 
    row.SetField("userfullname1", userfullname1); 
    row.SetField("userfullname2", userfullname2); 
    row.SetField("userfullname3", userfullname3); 
    row.SetField("Work", x.r2.Field<string>("Work")); 
} 
+0

Ничего не получилось: «Перечисление не дало никаких результатов» в переменном запросе. У меня есть userIDs, то есть userid1, userid2, userid3 в datatable2, но я хочу показать имя пользователей, поэтому существует другой тип данных, который содержит как идентификаторы пользователей с их полным именем. Теперь я хочу получить новый datatable со всеми 3 userfullnames вместо userID. –

2

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

DataTable dtResult = new DataTable(); 
dtResult.Columns.Add("ID", typeof(string)); 
dtResult.Columns.Add("name", typeof(string)); 


var result = from datatable1 in table1.AsEnumerable() 
      join datatable2 in table2.AsEnumerable() 
      on datatable1.Field<string>("ID") equals datatable2.Field<string>("userID") 

      select dtResult.LoadDataRow(new object[] 
      { 
       datatable1.Field<string>("ID"),    
     string.Format("{0} {1}" ,datatable1.Field<string>("fname") ,datatable1.Field<string>("lname")), 

       }, false); 
result.CopyToDataTable(); 
+0

Согласно вашему коду, он будет соответствовать только первому идентификатору пользователя в datatable2, но я хочу получить имена всех 3-х имен пользователей Datatable2 из Datatable1. –

+0

Взгляните на это http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_28284094.html. – crisu

+0

Загрузка содержимого из ваших таблиц '.AsEnumerable()' будет перечислять ваши результаты, таким образом загружая все их содержимое в память. Таким образом, это может помешать работе, если ваши таблицы слишком велики. – user1477388

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