Linq NOT IN (或 NOT EXISTS)、LEFT JOIN踩坑記


原先項目中有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 同理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM