Linq NOT IN(またはNOT EXISTS)、LEFT JOIN踏み込み記
1861 ワード
もとのプロジェクトの中でSQL文NOT INがあって、それをLinqに改造します
ネットで検索したのはすべてこの方法で、サブクエリの後でContainsは含むかどうかを判断します
NOT EXISTSであれば用いることもできる.Any(m=>...)
簡単そうで問題ないように見えますが、テスト中にエラーが報告されたことに気づき、「このコンテキストはベースタイプまたは列挙タイプのみをサポートしています」と、テストを繰り返しチェックし、午前中を費やしました.の
その後、この書き方は1つのエンティティしかサポートされていないことがわかりました.複数のエンティティであれば、別々に書きます.(EFにエンティティがマッピングされているはずですが、通常のlinqでは可能です)
中国語のネット上ですべてこのような事に言及していないで、stackoverflowの上で1篇だけ探し当てて、つまりこの問題
======================
LEFT JOIN:
LinqにLEFTJOINがないなんて...SQLキーワードを全部対応させることはできませんか...
intoとDefaultIfEmptyを使用し、値を付与するときにnullを判断するには
RIGHT JOIN同理
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同理