2011-07-14 7 views
0

linqで左/右結合に問題があります。私が持っているsql左揃えlinq lampda式

は、私がReadonlyCustomerテーブルに多くの顧客を持っている

public class Customer 
{ 
    prop string CustomerId { get; set; } 
    prop string LanguageGuid { get; set; } 
} 

public class ReadOnlyCustomer 
{ 
    prop string CustomerId { get; set; } 
    prop string LanguageGuid { get; set; } 
} 

を言うことができます。 私の場合、私は顧客テーブルにすべての顧客を持っていません。 私は結合を使用することはできません、私は内部結合には何もしません。 左または右の結合が必要です。

var test = db.Customer.Join(db.ReadOnlyCustomer, p => p.CustomerId, o => o.CustomerId, (c, o) => new ReadOnlyCustomer() { CustomerId = c.CustomerId, LanguageGuid = o.LanguageGuid ?? c.LanguageGuid }); 

この時点では、クエリがnull refで結合できないため、NULLポインタが返されます。

sql left joinと同じ左結合を実行するにはどうしたらいいですか。データソースに存在しない値に対してはNULLが返されます。

これは次のような構文をcomprehensingないlampdaにする必要があります(中oから....)

//あなたはその後に時々DefaultIfEmpty()への呼び出しと一緒に、GroupJoinを使用する必要があるデニス

+0

なぜ「理解」構文に入れることができないという要件ですか?私が知っている唯一の簡単な解決策は、 '分かりやすい'構文でしか動作しません:http://codingsense.wordpress.com/2009/03/08/left-join-right-join-using-linq/ – mellamokb

答えて

4

グループに1つのヌル値を与えます。 SelectMany()を使用すると、ペアごとに1つの結果が得られますが、結果の値の1つがnullである可能性があることに注意してください。例えば

:?関心のうち

// Note: can only do a *left* join, so "bigger" table comes first 
var test = db.ReadOnlyCustomer 
      .GroupJoin(db.Customer, 
         p => p.CustomerId, 
         o => o.CustomerId, 
         (p, os) => new { p, os = os.DefaultIfEmpty() }) 
      // Each pair may have multiple os here 
      .SelectMany(pair => pair.os.Select(o => new { pair.p, o })) 
      // Flattened, but o may be null 
      .Select(pair => new ReadOnlyCustomer { 
         CustomerId = pair.p.CustomerId, 
         LanguageGuid = o != null ? o.LanguageGuid ?? p.LanguageGuid 
               : p.LanguageGuid 
        }); 

(、はラムダ構文ではなく、クエリ式のように、この必要性は一般的にすべての種類の加入ない理由は、クエリ式で表現することが簡単です。 )

+0

Thx、これはうまく動作します。 。あなたの興味のある質問に答えるには:私はより多くの表現を動的にクエリに追加する必要があります。私はそれを行う方法の一つを使用したい、それ以外の場合、それは素敵に見えません。そして、私はこのフォームでクエリを行う方法を学びたいと思っていました。私はgoogleで解決策を見つけることに成功しなかった、私たちは言葉の最高ではない:P –

関連する問題