原先項目中有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=>...)
看上去很簡單沒什么問題,測試時發現報錯,【此上下文僅支持基元類型或枚舉類型】,反復檢查測試,花了半上午。。。
后來發現這種寫法只支持一個實體,如果是多個實體,要分開寫。(應該是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上找到一篇,就是說的這個問題
http://stackoverflow.com/questions/16836516/error-message-only-primitive-types-or-enumeration-types-are-supported-in-this
======================
LEFT JOIN:
Linq居然沒有LEFT JOIN。。。就不能把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 同理