我有分层数据结构,我在网页中显示为树视图。
我希望将数据排序为首先显示按字母顺序排列的节点,这些节点没有子节点,然后在这些节点下按字母顺序排序,这些节点有子节点。 目前我正在订购一个组中的所有节点,这意味着带有子节点的节点出现在没有子节点的节点旁边。
我正在使用递归方法来构建树视图,它的核心是LINQ代码:
var filteredCategory = from c in category
orderby c.Name ascending
where c.ParentCategoryId == parentCategoryId && c.Active == true
select c;
所以这是我想要增强的orderby语句。
下面显示的是数据库表结构:
[dbo].[Category](
[CategoryId] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NOT NULL,
[Level] [tinyint] NOT NULL,
[ParentCategoryId] [int] NOT NULL,
[Selectable] [bit] NOT NULL CONSTRAINT [DF_Category_Selectable] DEFAULT ((1)),
[Active] [bit] NOT NULL CONSTRAINT [DF_Category_Active] DEFAULT ((1))
答案 0 :(得分:0)
试试这个(替换c.Category)与孩子IQueryable<>:
var filteredCategory = from c in category
orderby c.Category.Count == 0
where c.ParentCategoryId == parentCategoryId && c.Active == true
select c;
答案 1 :(得分:0)
如果你正在使用Linq2SQL,你不能只通过获取没有父项的所有类别来构建树,然后根据需要访问子项来构建树吗?
我的意思是像这个查询一样选择根类别:
Category[] rootCats = (from c in category
orderby c.Name ascending
where c.ParentCategoryId == 0 // that is, no parent = root element
&& c.Active == true
select c).ToArray();
然后通过IEnumerable<Category>
访问指定类别(oneCat.Category.Where( cat => cat.Active == true)
)的子项。
答案 2 :(得分:0)
var filteredCategory = category
.Where(c => c.ParentCategoryId == parentCategoryId
&& c.Active == true)
.OrderBy(c => c.Children.Any() ? 1 : 2)
.ThenBy(c => c.Name);
如果您没有Children属性,请转到linq to sql designer并创建一个添加该属性的关联。