关于今天做项目时遇到的问题 以及解决办法

数据库中有张表名为:stCategory 意为分类表结构如下


stCategory
IDint
CategoryNamevarchar(50)
CategoryDescriptionvarchar(100)
CategorySSIDint
CreatDateTimeDatetime
ModifyDateTimeDatetime

因为要做无限级分类所以用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 = ""
			 }))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值