2

我正在将所有第一级/根单元加载到我的 Treeview 中。

一个单元是否有孩子决定了树视图是否显示“+”。

为了使这个符号在单元名称的左侧可用,我需要在我的 SQL 服务器上检查每个单元是否有子单元。我不需要计数,只要孩子是否存在就足够了。

我什至知道曾经有一个非常好的关于同一主题的 SO 解决方案,但我无法通过搜索找到这个解决方案。

我将不胜感激该解决方案或任何有用的链接:)

代码如下:

public IEnumerable<Unit> GetRootUnits(int templateId)
{
    List<Unit> units = new List<Unit>();

    using (var con = new SqlConnection(_connectionString))
    using (var cmd = new SqlCommand())
    {
        cmd.Connection = con;
        cmd.CommandText = "SELECT UnitId, ParentId, Name, TemplateId, HasChildren FROM Unit WHERE ParentId Is NULL AND TemplateId = @TemplateId";
        con.Open();

        var p1 = new SqlParameter("@TemplateId", templateId);
        cmd.Parameters.Add(p1);

        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                Unit unit = new Unit();
                unit.Id = Convert.ToInt32(reader["UnitId"]);
                unit.Name = reader["Name"].ToString();
                unit.TemplateId = Convert.ToInt32(reader["TemplateId"]);
                unit.ParentId = null;
                unit.IsLazy = Convert.ToBoolean(reader["HasChildren"]);
                units.Add(unit);
            }
        }
    }        
    return units;
}

更新:

我试过这个:

   SELECT Unit.UnitId, Unit.ParentId, Unit.Name, Unit.TemplateId,
      case when Exists(select null from Unit u2 where u2.ParentID = unit.UnitID)
     then 1
     else 0
     end as HasChildren
  FROM [ITMS].[dbo].[Unit]

我的测试数据:

1   NULL    unitroot1   1
2   NULL    unitroot2   1
3   NULL    unitroot3   1
4   NULL    unitroot4   1
5   NULL    unitroot5   1
6   NULL    unitroot6   1
7   NULL    unitroot7ffds fasddfasfds fsdadsffdsa fasdadsf  1
8   NULL    flfsaklfakl 1
9   NULL    flk43053094 1
10  NULL    sdaklr0340  1
11  NULL    3405303 1
12  NULL    543ß5ß343   1
13  NULL    54ß53ß534   1
14  NULL    45o345jo435jo   1
15  NULL    as435l5l54lk5   1
16  NULL    543095454j34    1
17  NULL    45354   1
18  NULL    kl  1
19  NULL    43534   1
20  NULL    5435    1
21  NULL    1   1
22  NULL    12  1
23  NULL    bla 1
24  7   childrenOfUnitRoot7 this is a scrolling test    1
25  24  blubb   1
4

1 回答 1

2

如果您想获取父母是否有孩子的信息并在HasChildren列中返回该信息,您可以使用存在:

case when exists (select null from Unit u2 where u2.ParentID = unit.UnitID)
     then 1
     else 0
     end as HasChildren

或者,您可以申请 apply

SELECT Unit.UnitId, Unit.ParentId, Unit.Name, Unit.TemplateId, 
       isnull(c.HasChildren, 0) HasChildren
  FROM Unit 
 -- Get first child record. Returns null record if not found.
 OUTER APPLY
 (
   select top 1
          1 as HasChildren
     from Unit u2
    where u2.ParentID = Unit.UnitID
 ) c
 WHERE Unit.ParentId Is NULL 
   AND Unit.TemplateId = @TemplateId

第三种选择是加入其自身Unit的派生版本Unit

SELECT Unit.UnitId, Unit.ParentId, Unit.Name, Unit.TemplateId, 
    -- If c.ParentID is not null we know that there must be
    -- at least one child for this UnitID
       case when c.ParentID is not null then 1 else 0 end HasChildren
  FROM Unit 
  LEFT JOIN
  (
    select distinct ParentID
      from Unit
  ) c
    ON Unit.UnitID = c.ParentID
  WHERE Unit.ParentId Is NULL 
    AND Unit.TemplateId = @TemplateId

最后,如果这是 Sql Server 2008,则有HierarchyId 数据类型。我没用过,所以不能给你第一手的印象,但绝对值得一看。

于 2012-06-04T02:34:56.090 回答