Linq NOT IN(またはNOT EXISTS)、LEFT JOIN踏み込み記

1861 ワード

もとのプロジェクトの中でSQL文NOT INがあって、それをLinqに改造します
var b = from e in YY
        where !(
            from c in XX
            where c.XXId == 123
            select c.XXId
        ).Contains(e.YYId)

ネットで検索したのはすべてこの方法で、サブクエリの後でContainsは含むかどうかを判断します
NOT EXISTSであれば用いることもできる.Any(m=>...)
 
簡単そうで問題ないように見えますが、テスト中にエラーが報告されたことに気づき、「このコンテキストはベースタイプまたは列挙タイプのみをサポートしています」と、テストを繰り返しチェックし、午前中を費やしました.の
その後、この書き方は1つのエンティティしかサポートされていないことがわかりました.複数のエンティティであれば、別々に書きます.(EFにエンティティがマッピングされているはずですが、通常のlinqでは可能です)
var a = from c in XX
        where c.XXId == 123
        select c.XXId;
        
var b = from e in YY
        where !a.Contains(e.YYId)

中国語のネット上ですべてこのような事に言及していないで、stackoverflowの上で1篇だけ探し当てて、つまりこの問題
http://stackoverflow.com/questions/16836516/error-message-only-primitive-types-or-enumeration-types-are-supported-in-this

 
======================
LEFT JOIN:
LinqにLEFTJOINがないなんて...SQLキーワードを全部対応させることはできませんか...
from a in b
left join c in d on a.xx equal c.xx
into e
from f in e.DefaultIfEmpty()
select new {
    a.XX,
    YY = f==null? "" : f.YY
}

intoとDefaultIfEmptyを使用し、値を付与するときにnullを判断するには
RIGHT JOIN同理