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()
     }

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

    看一个数据库的监控

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

    我的代码运行是这样的

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

    回到目录

  • 相关阅读:
    Hdu 1257 最少拦截系统
    Hdu 1404 Digital Deletions
    Hdu 1079 Calendar Game
    Hdu 1158 Employment Planning(DP)
    Hdu 1116 Play on Words
    Hdu 1258 Sum It Up
    Hdu 1175 连连看(DFS)
    Hdu 3635 Dragon Balls (并查集)
    Hdu 1829 A Bug's Life
    Hdu 1181 变形课
  • 原文地址:https://www.cnblogs.com/lori/p/3919551.html
Copyright © 2011-2022 走看看