2012-04-20 143 views
2

這是我的舊代碼:LINQ - LEFT JOIN

var destinctList = HoldingsList.DistinctBy(x => new { x.ClientName, x.ProductName }).Select(x => new { ClientName = x.ClientName, ClientProductName = x.ProductName }).ToList(); 

foreach (var item in destinctList) 
{ 

    var clientAlias = (from ca in someContext.ClientAlias 
         where ca.Name == item.ClientName 
         orderby ca.CreationDate descending 
         select ca).FirstOrDefault(); 

    if (clientAlias != null) 
    { 
     destinctList.Where(x => x.ClientName == item.ClientName).ForEach(x => x.ClientID = clientAlias.ClientID); 
    } 

    ClientProductAlias clientProductAlias = null; 

    if (clientAlias != null) 
    { 
     clientProductAlias = (from ca in someContext.ClientProductAlias 
           where ca.Name == item.ClientProductName 
           && ca.ClientID == clientAlias.ClientID 
           orderby ca.CreationDate descending 
           select ca).FirstOrDefault(); 
    } 

    if (clientProductAlias != null) 
    { 
     destinctList.Where(x => x.ClientProductName == item.ClientProductName).ForEach(x => x.ClientProductID = clientProductAlias.ClientProductID); 
    } 
} 

這完美地工作,但它採取長。

現在我想使所有的工作與聯接。這是我到目前爲止:

(from list in destinctList 
join ca in someContext.ClientAlias on list.ClientName equals ca.Name into list_client_join 
from list_client in list_client_join.DefaultIfEmpty 
join cpa in someContext.ClientProductAlias on new { ClientID = (long)list.ClientID, Name = list.ClientProductName } equals new { cpa.ClientID, cpa.Name } into j1 
from j2 in j1.DefaultIfEmpty 
orderby list_client.CreationDate descending 
orderby j2.CreationDate descending 
select new { ClientID = list_client.ClientID, 
      ClientName = list.ClientName, 
      ClientProductID = j2.ClientProductID, 
      ClientProductName = list.ClientProductName }).ToList(); 

這是我到目前爲止,但沒有返回任何東西。我究竟做錯了什麼?

+2

也許你可以從一個表中選擇啓動,然後繼續在同一時間加入新表一個,直到找到問題。 – mbeckish 2012-04-20 13:28:28

+0

@mbeckish我做了,但它仍然沒有工作......連接似乎搞亂了查詢...任何其他的建議? – Willem 2012-04-20 14:01:43

+2

@Willem - 呃......你真的明白mbeckish說什麼嗎? 「我做到了,但它仍然不起作用」是對這一評論的無意義反應。如果你做到了,它在什麼時候失敗?什麼問題加入? – 2012-04-20 14:07:12

回答

3

我注意到你的DefaultIfEmpty語句缺少括號,而且我認爲問題在於它如何處理連接到空數據。我認爲你肯定需要撥打where j1.Any(),你可能還需要where list_client_join.Any()

(from list in destinctList 
join ca in someContext.ClientAlias on list.ClientName equals ca.Name into list_client_join 
//where list_client_join.Any() 
from list_client in list_client_join.DefaultIfEmpty() 
join cpa in someContext.ClientProductAlias on new { ClientID = (long)list.ClientID, Name = list.ClientProductName } equals 
    new { cpa.ClientID, cpa.Name } into j1 
// maybe needs the following: 
where j1.Any() 
from j2 in j1.DefaultIfEmpty() 
orderby list_client.CreationDate descending 
orderby j2.CreationDate descending 
select new { ClientID = list_client.ClientID, 
      ClientName = list.ClientName, 
      ClientProductID = j2.ClientProductID, 
      ClientProductName = list.ClientProductName }).ToList(); 

更新:

// alternate query 
(from list in destinctList 
let ca = someContext.ClientAlias 
      .OrderByDescending (cca => cca.CreationDate) 
      .FirstOrDefault (cca => cca.Name == list.ClientName) 
let cca = someContext.ClientProductAlias 
      .OrderByDescending (ccpa => ccpa.CreationDate) 
      .FirstOrDefault(ccpa => int.Equals(ccpa.ClientID, 
          ca == null ? -1 : ca.ClientID) && 
          string.Equals(ccpa.Name,list.ClientProductName)) 
select new 
{ 
    ClientID = ca != null ? ca.ClientID : -1, 
    ClientName = list.ClientName, 
    ClientProductID = cca != null ? cca.ClientProductID : -1, 
    ClientProductName = list.ClientProductName 
} 
).ToList();  

模擬了使用數據:http://ideone.com/XEqf4

+0

感謝Brad的回答,但它仍然返回0結果。只要我添加第一個連接,結果爲0.此時這兩個表都是空的。 'DestinctList'有結果...所以,我做了左邊的連接是否正確,或者我錯過了什麼? – Willem 2012-04-23 07:04:12

+1

@Willem,如果ClientAlias或ClientProductAlias表與您的destinctList中的數據不匹配,那麼查看您的原始代碼看起來像不希望返回任何數據。我[嘲笑了一個例子](http://ideone.com/XEqf4)在這裏使用數據來展示它如何返回結果。我還更新了我的答案,以包含備用連接方法以顯示其他列表中未找到的數據。 – 2012-04-23 18:33:55

+0

似乎也適合我。由於翻譯,我在Linq的左連接性能方面遇到了很大問題(內連接的條件爲左連接)。從幾分鐘到5秒。非常感謝! – Rufix 2013-08-21 13:29:26