数据库中有张表名为: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 = ""
}))