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

来源:互联网 发布:南京聚铭网络怎么样 编辑:程序博客网 时间:2024/04/30 04:02

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


stCategoryIDintCategoryNamevarchar(50)CategoryDescriptionvarchar(100)CategorySSIDintCreatDateTimeDatetimeModifyDateTimeDatetime

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

原创粉丝点击