zoukankan      html  css  js  c++  java
  • linq to entity 左连接 右连接 以及内连接写法的区别

    左连右连还是内连这个其实你不需要关心。只需要根据实体的映射关系写查询,框架会自动帮你生成的。 至于linq查询语法与扩展方法的效率,应该是一样的,比如:

      var users=(from u in db.Users where u.UserRoleId==1 select u) .ToList();
     var users2=db.Users.Where(u=>u.UserRoleId==1).ToList();

    这两句查询实际上是等效的。

    inner join:
     var =from x in db.T1
          join y in db.T2
          on x.yId equals y.Id
          select x;

    left join:

     var =from x in db.T1
          join y in db.T2
          on x.yId equals y.Id into temp
          from y in temp.DefalutIfEmpty()
          select new{x.Id,Name=y==null "":y.Name};

    right join 原理同 left join

    至于效率,lamda表达式同标准表达式

    LINQ TO EF 用   from x in temp.DefalutIfEmpty() 不是百分百会执行左连接的

    主要要看 关系的配置 以及数据库那边 是否为空 外键

    linq中怎么实现多条件关联的左连接???

    sql语句:
    SELECT * FROM T_COURSE a left join T_USER_COURSE_RECORD tucr ON a.COURSE_ID=tucr.COURSE_ID
    and tucr.[USER_ID]=@userId
    userId是传入的参数

    var data = from c in db.T_COURSE
                           join u in db.T_USER_COURSE_RECORD
                           on new { COURSE_ID=(long?)c.COURSE_ID, USER_ID=(long?)userId } 
                           equals new { COURSE_ID=u.COURSE_ID,USER_ID=u.USER_ID }
                           into x
                           from cx in x.DefaultIfEmpty()
                           select new
                           {
                               c.COURSE_NAME,
                               cx.COURSE_ID,
                               USER_COURSE_ID = cx == null ? 0:cx.USER_COURSE_ID,
                               cx.USER_ID,
                               SCORE = (cx == null | cx.SCORE == -1) ? "未完成" : cx.SCORE.ToString(),
                           };
                return data;
    View Code

    特别是这句:

    on new { COURSE_ID=(long?)c.COURSE_ID, USER_ID=(long?)userId }

    equals new { COURSE_ID=u.COURSE_ID,USER_ID=u.USER_ID } 你应该确保组合键对应值的返回类型是一致的
    long 对 long?就会产生错误

    另外还可以这么写,更简便:

    var data = from c in db.T_COURSE
                           join u in db.T_USER_COURSE_RECORD.Where(x=>x.USER_ID ==userId)
                           on c.COURSE_ID equals u.COURSE_ID into x
                           from cx in x.DefaultIfEmpty()
                           select new
                           {
                               c.COURSE_NAME,
                               COURSE_ID=cx,
                               USER_COURSE_ID=cx==null?0:cx.USER_COURSE_ID,
                               USER_ID= cx,
                               SCORE =( cx==null|cx.SCORE == -1) ? "未完成" : cx.SCORE.ToString()
                           };
    View Code

    http://blog.csdn.net/whw6263989/article/details/7877285

  • 相关阅读:
    日记1
    JDK、JRE、JVM三者间的关系
    线性表之二,SLINKLIST(单链表)类,模板类及C链表(增删改查,广义表
    线性表之一,SEQLIST(顺序表)类及其父类LIST,模板类及C结构体,包装顺序表
    PTA(中国人民解放军陆军工程大学数据结构,C语言)
    冒泡排序
    选择排序、堆排序
    冒泡排序,快速排序
    springMVC定时器
    MD5加密
  • 原文地址:https://www.cnblogs.com/love201314/p/5063777.html
Copyright © 2011-2022 走看看