2016-05-13 38 views
2

我想用我的記錄列表連接用戶列表,但是記錄列表有兩列,我應該使用用戶列表的值,這兩列中的一列也是可以爲空的。如何正確加入?我試圖做這樣的事情:linq加入兩個id與單個列表的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(); 

如我所料它沒有工作,我記得我必須將其設置爲空,如果使用默認值。

比如我有用戶

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's?如果是的話,你使用的是什麼ORM框架? –

+0

這只是我想要的例子,我使用EFD 6與DDD模式,所以我的數據庫上下文是不同的,就像兩個不同的數據庫 – GrandaS

+0

聲音像你只需要一個外部聯接?如果是這樣,看到這個職位:http://stackoverflow.com/questions/3404975/left-outer-join-in-linq – sgeddes

回答

1

那麼,你需要執行left outer join爲opt有理(可爲空)域(然後訪問相關的對象屬性時,當然再檢查一下爲null):

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' –