2016-11-17 14 views
0

を使用して複数のテーブルを結合しますクエリは純粋なラムダ式で記述する必要があります左は、私は2つのテーブルを持っているラムダ式

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

は、あなたがリストを共有することができますし、テーブルのようになりたかった:

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(); }); 

あなたはこれを取得:

は今、あなたは結果を列挙する場合は? – 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; } 
} 
あなたが結合されたテーブルの要素のリストから始まるテーブルのすべての要素でタプルを取得

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拡張メソッドのヘルプ:便宜のために、私はいくつかの例のデータを作成している今、

LINQクエリ、 。

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(); 
関連する問題