2016-05-13 7 views
2

レコードリストにユーザーのリストを追加したいが、レコードリストにはユーザーリストの値を使用する必要がある2つの列があり、正しく結合するには?私はこのような何かをしようとしていた:私は予想通りlinq 2つのidを1つのリストに結合するためのSQLステートメント

var results = (from r in records 
       join u in users on r.RegisteredBy equals u.Id 
       join u in users on r.ModifiedBy equals u.Id 
       select new CustomResult() 
       { 
        Id = r.Id, 
        Name = r.Name, 
        RegisteredByName = u.Name, 
        ModifiedByName = u.Name 
       }).ToList(); 

は、それが機能しなかった、私は私がnullの場合は、デフォルト値を使用するように設定する必要があることを覚えておいてください。例えば

、私はユーザー

var user1 = new User() { Id = 1, Name = "John" }; 
var user2 = new User() { Id = 2, Name = "Matt" } 
var user3 = new User() { Id = 3, Name = "George" }; 

List<User> users = new List<User>(){ user1, user2, user3 }; 

のリストを持っていると私は私のレコードの別のリストを持っている、すなわち

var record1 = new Record() { Id = 1, Name = "Record1", RegisteredBy = 1, ModifiedBy = 3}; 
var record2 = new Record() { Id = 2, Name = "Record2", RegisteredBy = 3, ModifiedBy = null }; 
var record3 = new Record() { Id = 3, Name = "Record3", RegisteredBy = 2, ModifiedBy = 1 }; 

List<Record> records = new List<Record>(){ record1, record2, record3 }; 

この結果参加し、私はクラスの別のリストを作りたいです

var result1 = new CustomResult(){ Id = 1, Name = "Record1", RegisteredByName = "John", ModifiedByName = "George" }; 
var result2 = new CustomResult(){ Id = 2, Name = "Record2", RegisteredByName = "George", ModifiedByName = null }; 
var result3 = new CustomResult(){ Id = 1, Name = "Record3", RegisteredByName = "Matt", ModifiedByName = "John" }; 
+0

あなたの本当の場合は、実際に一覧表示されますまたはデータベーステーブルのものですか?すなわち 'IQueryable'ですか?はいの場合は、どのORMフレームワークを使用していますか? –

+0

これはちょうど私が欲しいものの例です、私はDDDパターンでef 6を使用していますので、データベースのコンテキストは2つの異なるデータベースのように異なります – GrandaS

+0

あなたは外部結合が必要ですか?もしそうなら、この記事を見てください:http://stackoverflow.com/questions/3404975/left-outer-join-in-linq – sgeddes

答えて

1

よく、あなたはleft outer joinを実行する必要があります(NULL可能)フィールド(その後、nullのためのコースchechの関連オブジェクトのプロパティにアクセスする)ional:

var results = (from r in records 
       join ru in users on r.RegisteredBy equals ru.Id 
       join mu in users on r.ModifiedBy equals mu.Id into modifiedBy 
       from mu in modifiedBy.DefaultIfEmpty() 
       select new CustomResult() 
       { 
        Id = r.Id, 
        Name = r.Name, 
        RegisteredByName = ru.Name, 
        ModifiedByName = mu != null ? mu.Name : string.Empty 
       }).ToList(); 
+1

コメントと回答の皆様に感謝します! – GrandaS

+0

@fqhvそうではありません。おそらく、C#6 "elvis"演算子を意味します: '= mu?.Name ?? string.Empty' –

関連する問題