文章出處

回到目錄

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

我們可以看到,它的巧妙是在數據賦值上...

看一個數據庫的監控

剛看到后,真是下了我一大跳,怎么連了這么多庫呀,暈,然后,本地設斷點調試了一下,原來和我的代碼沒有關系,是其它代碼惹的禍!

我的代碼運行是這樣的

這是可以接受的,在我的預料之中,呵呵。

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()