關於今天做項目時遇到的問題 以及解決辦法

數據庫中有張表名爲:stCategory 意爲分類表結構如下


stCategory
ID int
CategoryName varchar(50)
CategoryDescription varchar(100)
CategorySSID int
CreatDateTime Datetime
ModifyDateTime Datetime

因爲要做無限級分類所以用CategorySSID對應上一級的ID 一級分類默認CategorySSID爲0

現在要實現在表裏新增一個臨時字段名爲ParentName 因爲不在數據庫裏新增字段了所以我們的Linq應該怎麼寫呢?

首先理清思路我們可以用left join 左連接先形成一張表名A1 用CategorySSID對應ID 可以取出如圖上的10條記錄,因爲一級分類CategorySSID爲0所以沒有對應的肯定取不出來。所以應該對一級分類單獨操作用條件篩選出來 where CategorySSID=0 形成第二張表A2。

這時候其實已經完成一半了,剩下的只需要將兩表合併。可是兩表怎麼合併呢。。我sql和Linq都寫了。Sql中依舊還是用左連接不過這次不用相依的對應left join  on A1.ID=A2.ID 在表裏因爲ID是唯一的不可能有相同的,所以實際上做的是把2張表合併....在Linq中我是用的

Union(合併)

說明:連接不同的集合,自動過濾相同項;延遲。即是將兩個集合進行合併操作,過濾相同的項。

首先2張表結構必須相同 A1和A2實際都是stCategory表。所以直接合並沒有關係。但是如果結構不同的話必須使他們結構相同。

例如A1表裏我還新增了一個字段 就是上述所說的臨時字段名爲ParentCategoryName 可是A2表裏沒有怎麼辦?我們可以僞造一個 讓它是空的就行了。我們篩選的A2表數據都是一級分類的CategorySSID都爲0不影響我們之間的操作。

下面貼上Linq和Sql的實現代碼。

Sql:


SELECT   a.ID, a.CategoryName, a.CategoryDescripition, a.CategorySSID, a.CreatDatetime, a.ModifyDateTime, 
                b_1.PartName AS ParentCategoryName
FROM      wsdCategory AS a LEFT OUTER JOIN
                    (SELECT   a.ID, a.CategoryName, a.CategoryDescripition, a.CategorySSID, a.CreatDatetime, a.ModifyDateTime, 
                                     b.CategoryName AS PartName
                     FROM      wsdCategory AS a INNER JOIN
                                     wsdCategory AS b ON a.CategorySSID = b.ID) AS b_1 ON a.ID = b_1.ID
ORDER BY b_1.CategorySSID, a.CategorySSID, b_1.CreatDatetime DESC, a.CreatDatetime

Linq:

 (from p in WsdCategories
						  join pp in WsdCategories
						  on p.CategorySSID equals pp.ID
						  select new
						  {
							  List = p,
							  PartName = pp.CategoryName
						  }).Union(
						  (from pp in WsdCategories
						  where pp.CategorySSID.Equals(0)
						   select new
			 {
				 List = pp,
				 PartName = ""
			 }))

發佈了40 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章