2012-04-20 7 views
2

に参加:LINQ - LEFTこれは私の古いコードです

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

はたぶん、あなたは、あなたが見つけるまで、一度に新しい表1に参加し続ける、一つのテーブルから選択して起動することができます問題。 – mbeckish

+0

@mbeckish私はしましたが、まだ動作していません...ジョイントがクエリを混乱させるようです...他のアドバイスはありますか? – Willem

+2

@Willem - Uhhh ...あなたは実際にmbeckishが言ったことを理解しましたか? "私はしましたが、それでも動作していません"というのは、そのコメントには意味がない。あなたがした場合、どの時点で失敗するのですか?何が問題になるのですか? –

答えて

3

あなたのDefaultIfEmptyステートメントに括弧がないことに気がつきました。また、問題はnullデータへの結合を処理する方法だと思います。 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

+1

@Willem ClientAliasまたはClientProductAliasテーブルがdestinctList内のデータと一致しない場合は、元のコードを見て、データを返さないように見えます。私はここでデータを再生してどのように結果を返すかを示すために[exampleを模擬しました](http://ideone.com/XEqf4)を読んでいます。他のリストにないデータを表示するための代替結合メソッドを含むように私の答えを更新しました。 –

+0

私のために働くようにも見えます。私は翻訳のためにLinqの左ジョインのパフォーマンスに大きな問題がありました(左ジョインとして動作する条件で内部ジョイン)。数分から5秒間を得ました。どうもありがとう! – Rufix

関連する問題