zoukankan      html  css  js  c++  java
  • EF架构~LinqToEntity里实现left join的一对一与一对多

    回到目录

    对于linq to sql里实现left join我已经介绍过了,这篇文章的出现是由于最近在项目里遇到的一个问题,解决这个问题花了我不少时间,可能有2个小时,事件是这样的,对于两个表,它们是一对多关系,而需求是返回一个一对一的关系,并将最新的数据返回,这个很多同学都知道,可以使用inner join,但是,对于inner  join来说,当处理的是一对多关系时,它将会出现多条记录,这也是正常的;而它并不满足我们今天的需求,经过测试后,找到了解决这个问题的方法,下面看代码:

    一对多关系

    from r in base.GetModel()
    join data in new TsingDa_NewLearningBarRepository<FAQ_Reply>(UnitWork).GetModel().Where(i => i.Status == (int)Status.Normal)
    on r.FAQInfoID equals data.FAQInfoID into list

    这个很容易理解,将满足faqinfoId的FAQ_Reply集合获出,放入list变量中。

    一对一关系

    from r in base.GetModel()
    join data in new TsingDa_NewLearningBarRepository<FAQ_Reply>(UnitWork).GetModel().Where(i => i.Status == (int)Status.Normal)
    on r.FAQInfoID equals data.FAQInfoID

    这种写法是正规的inner join写法,它适合于数据结构中的一对一关系,即两张表有相同的主键,它们在数据中是严格一对一的,如果不是一对一,那种,这个语句将会出现重复数据!

    下面是在EF中对left  join进行的一对一改造

     join data in new TsingDa_NewLearningBarRepository<FAQ_Reply>(UnitWork).GetModel().Where(i => i.Status == (int)Status.Normal)
     on r.FAQInfoID equals data.FAQInfoID into list
     from data in list.EmptyOrDefalt()

    可很遗憾,并不成功,还是返回的重复数据,这在传统的linq to sql中是可以的,但在linq to entity中是不行的,因为它们生成SQL语句的内核不同

    正确的一对一做法

     join data in new TsingDa_NewLearningBarRepository<FAQ_Reply>(UnitWork).GetModel().Where(i => i.Status == (int)Status.Normal)
     on r.FAQInfoID equals data.FAQInfoID into list
     select new FAQ_Info_Ext()
     {
      FAQReply = list.OrderByDescending(i => i.AddTime).FirstOrDefault()
     }

    我们可以看到,它的巧妙是在数据赋值上...

    看一个数据库的监控

    刚看到后,真是下了我一大跳,怎么连了这么多库呀,晕,然后,本地设断点调试了一下,原来和我的代码没有关系,是其它代码惹的祸!

    我的代码运行是这样的

    这是可以接受的,在我的预料之中,呵呵。

    回到目录

  • 相关阅读:
    快排原理讲解
    Kafka原理详解
    java中的基本数据类型转换
    centos7关闭防火墙
    安装Linux基本工具
    Kibana笔记
    虚拟机配置net模式
    2019-10-12,html+php+mysql简单留言板,作业
    2019-10-11:渗透测试,基础学习,php+mysql连接,笔记
    2019-10-10:渗透测试,基础学习,mysql语法基础,笔记
  • 原文地址:https://www.cnblogs.com/lori/p/3919551.html
Copyright © 2011-2022 走看看