數據庫中有張表名爲: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 = ""
}))