zoukankan      html  css  js  c++  java
  • 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 同理

  • 相关阅读:
    Android开发日志问题
    Android 常用的快捷键(随时更新)
    Android v4 包和v7包问题
    mongoDB 3.0.3 以上GUI 连接认证问题
    python(6)
    python学习(5)
    01_数字滤波器调研
    动态称重数据处理算法及其在禽蛋和类球形水果分选中的应用研究-01
    点云学习
    10-视频图像读取与保存
  • 原文地址:https://www.cnblogs.com/liuyouying/p/5190159.html
Copyright © 2011-2022 走看看