回到目錄
對于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()
}
我們可以看到,它的巧妙是在資料指派上...
看一個資料庫的監控
剛看到後,真是下了我一大跳,怎麼連了這麼多庫呀,暈,然後,本地設斷點調試了一下,原來和我的代碼沒有關系,是其它代碼惹的禍!
我的代碼運作是這樣的
這是可以接受的,在我的預料之中,呵呵。
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!
