2016-11-17 1 views
0

У меня есть 2 таблицы:слева объединить несколько таблиц с помощью лямбда-выражения

функции {specId, убывание, CreatedBy, lastupdatedby}
пользователей {USERID, имя пользователя}

Я хочу ниже LINQ запрос должен быть записан в виде чистой лямбда

from spec in specs 
    from user in users.where(x => x.userId== spec.createdby).DefaultIfEmpty() 
    from updatedUser in users.where(x => x.userId== spec.lastupdatedbyby).DefaultIfEmpty() 
select new { 
spec = spec 
user = user, 
updatedUser = updatedUser 
} 

Пожалуйста, помогите.

данные будут, как говорят:

spec[{1, test, 1234, 2345},{2, test1, 1234, null}] 

users[{1234, Allen},{2345, Dwayne}] 

Таким образом, результат должен быть

[{1, test, Allen, Dwayne}, {2, test1, Allen, null}] 
+0

Можете ли вы поделиться список и вы хотели привести как таблицы? – Eldeniz

+0

@ Eldeniz Я только что обновил свой вопрос с образцами данных и результатом. –

+0

@RustinCohle, пожалуйста, проверьте мой ответ – user449689

ответ

1

Давайте начнем с этих классов:

class Specs { 
    public int specId { get; set; } 
    public string desc { get; set; } 
    public int createdby { get; set; } 
    public int lastupdatedby { get; set; } 
} 

class Users { 
    public int userId { get; set; } 
    public string username { get; set; } 
} 

class UpdatedUser { 
    public int userId {get; set;} 
    public string username { get; set; } 
} 

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

var specs = new Specs[] 
{ 
    new Specs{specId = 1, desc = "Spec1", createdby=1, lastupdatedby=1}, 
    new Specs{specId = 2, desc = "Spec2", createdby=2, lastupdatedby=3},  
    new Specs{specId = 3, desc = "Spec3", createdby=3, lastupdatedby=1}, 
    new Specs{specId = 4, desc = "Spec4", createdby=3, lastupdatedby=3}, 
}; 

var user = new Users[] 
{ 
    new Users{userId = 1, username = "User1"}, 
    new Users{userId = 2, username = "User2"}, 
}; 

var updatedUser = new UpdatedUser[] 
{ 
    new UpdatedUser{userId = 1, username = "UpdatedUser1"}, 
    new UpdatedUser{userId = 2, username = "UpdatedUser2"},   
}; 

var result = specs 
    .GroupJoin(user, 
     s => s.createdby, 
     u => u.userId, 
    (s, u) => u.Select(x => new {spec = s, user = x}) 
      .DefaultIfEmpty(new {spec = s, user = (Users)null})) 
.SelectMany(g => g) 
.GroupJoin(updatedUser, 
     firstJoin => firstJoin.spec.lastupdatedby, 
     uu => uu.userId, 
     (firstJoin, uu) => 
     uu.Select(y => new {spec = firstJoin.spec, user = firstJoin.user, updatedUser = y}) 
.DefaultIfEmpty(new {spec = firstJoin.spec, user = firstJoin.user, updatedUser = (UpdatedUser) null})) 
    .SelectMany(g1 => g1) 
    .ToList(); 

Метод GroupJoin расширения поможет вам получить кортеж со всеми элементами исходной таблицы со списком элементов присоединяемой таблицы ,

Теперь, если вы перечислить результаты:

result.ForEach(item => { 
    Console.WriteLine(item.spec.desc); 
    Console.WriteLine(item.user != null ? item.user.username : "NULL"); 
    Console.WriteLine(item.updatedUser != null ? item.updatedUser.username : "NULL"); 
    Console.WriteLine(); 
}); 

Вы получаете это:

Spec1 
User1 
UpdatedUser1 

Spec2 
User2 
NULL 

Spec3 
NULL 
UpdatedUser1 

Spec4 
NULL 
NULL 
0

Вы можете попробовать

var list = specs.Join(users, 
       s => s.lastupdatedby, 
       u => u.userid, 
       (s, u) => new { specs = s, users = u }) 
       .Select(x => new { 
        specId = x.specs.specId, 
        desc = x.specs.desc, 
        createdby=x.specs.createdby, 
        username=x.users.username 

       }).ToString(); 
Смежные вопросы