文章出處
文章列表
對于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() }
我們可以看到,它的巧妙是在數據賦值上...
看一個數據庫的監控
剛看到后,真是下了我一大跳,怎么連了這么多庫呀,暈,然后,本地設斷點調試了一下,原來和我的代碼沒有關系,是其它代碼惹的禍!
我的代碼運行是這樣的
這是可以接受的,在我的預料之中,呵呵。
文章列表
全站熱搜