请教一个Linq查询树结构问题

时间:2023-01-19 17:05:40
下图中每一个节点都是一个实体类都继承自IModel接口(文件夹节点除外),我现在需要用Linq操作这个树。比如我需要查找有哪些节点被勾选(IsChecked=true)来进一步操作,还需要实现搜索遍历每个节点匹配关键字返回一个新对象显示到TreeView中。我不是伸手党现在的问题是不知道怎么用Linq操作这个树

不知道有没有表达清楚,如果有会的朋友请帮帮我

这个是IModel接口的定义
public interface IModel:INotifyPropertyChanged
    {
        string Name { get; set; }

        ImageSource Icon { get; }

        string SqlScript { get; }

        bool IsChecked { get; set; }

        bool IsExpand { get; set; }

        ObservableCollection<Folder> Folders { get; set; }
    }


这个是TreeView的数据模板
<HierarchicalDataTemplate>
                    <HierarchicalDataTemplate.ItemsSource>
                        <MultiBinding Converter="{StaticResource TreeDataConvert}">
                            <Binding Path="Tables"/>
                            <Binding Path="Views"/>
                            <Binding Path="Functions"/>
                            <Binding Path="Procedures"/>
                            <Binding Path="Columns"/>
                            <Binding Path="Triggers"/>
                            <Binding Path="Checks"/>
                            <Binding Path="ForeignKeys"/>
                            <Binding Path="UnClustereds"/>
                            <Binding Path="Clustered"/>
                            <Binding Path="Folders"/>
                        </MultiBinding>
                    </HierarchicalDataTemplate.ItemsSource>


请教一个Linq查询树结构问题

15 个解决方案

#1


贴出你不用Linq进行遍历的代码来,让别人给你改一下。

#2


我现在只会查询第一层的数据库,下层还有表、函数、存储过程、视图等,表下面还有触发器、列等。。。
我想实现把符合条件的对象查询出来,可以是树结构也可以是单独类显示到TreeView中

string key = txtSearch.Text.ToLower();
            //TreeItemSource是这样定义的:private static ObservableCollection<Database> TreeItemSource = new ObservableCollection<Database>();
            var quest = from db in TreeItemSource
                        where db.Name.ToLower().Contains(key)
                        select db as DBConvert.Interface.IModel;

            TreeView1.ItemsSource = quest;

#3


会一层就够了。

多层,使用迭代器。

参考 http://bbs.csdn.net/topics/390680469

#4


和linq无关,如果你不懂递归,用啥都做不出。

#5


请教一个Linq查询树结构问题原来范冰冰是负责5楼WC的啊

#6


在你的“查询第一层的数据库”下面写一个foreach语句,就可以了!

引用 5 楼 h598937749 的回复:
请教一个Linq查询树结构问题原来范冰冰是负责5楼WC的啊


只要你将来有了“*”(不用整天上班打卡),这个可以有啊。

#7


如果不用linq我应该可以实现,就像我现在的treeview那样显示,我只是想学下linq

#8


不写出迭代搜索(返回IEnumerable<T>的那个方法),你如何linq?

#9


类似这样的foreach嵌套是吧 请教一个Linq查询树结构问题

#10


TreeItemSource这个集合里面已经有的数据源,连接服务器后把所有的对象都搜索出来了,我就是想用Linq在这个集合中匹配关键字的对象出来

#11


呵呵,重新学习一下数据结构里边的树搜索。而这种搜索在c#里边的语法,可以参考我写的 GetDepartments 方法。

#12


许多人写程序的思维,可能就是“画个流程图,然后分步实施”的学生思路。

而.net开发中许多有意义的设计模式是用来给你分层的。“迭代器”就是其中之一。

分层了的代码,对于不懂的人可能更加看不懂。但是对于理解分层的初衷的人,则可以把复杂的逻辑一下子变得特别简单。“分层”是那种仅仅“分步实施”的思路所不能达到的。

如果你看到一个人写的复杂程序很少有多余的if..else分支结构,那么你应该看看他是不是有分层架构做理论支持。

#13


请教一个Linq查询树结构问题
刚刚用LINQ to DataSet重写了递归树。。。
一上来就看到这贴。。。这么巧么?

#14


兄台对我这个有什么感想?

#15


引用 14 楼 h598937749 的回复:
兄台对我这个有什么感想?


方法1(子ID)
{
   找出所有“子ID”的项目,
   foreach(孙项 in 查出结果)
  {
     树中.add(方法1(孙ID));
  }
}
//方法可以且最好带返回值的,这个“回环”比较难解释,看看应该明白。

#1


贴出你不用Linq进行遍历的代码来,让别人给你改一下。

#2


我现在只会查询第一层的数据库,下层还有表、函数、存储过程、视图等,表下面还有触发器、列等。。。
我想实现把符合条件的对象查询出来,可以是树结构也可以是单独类显示到TreeView中

string key = txtSearch.Text.ToLower();
            //TreeItemSource是这样定义的:private static ObservableCollection<Database> TreeItemSource = new ObservableCollection<Database>();
            var quest = from db in TreeItemSource
                        where db.Name.ToLower().Contains(key)
                        select db as DBConvert.Interface.IModel;

            TreeView1.ItemsSource = quest;

#3


会一层就够了。

多层,使用迭代器。

参考 http://bbs.csdn.net/topics/390680469

#4


和linq无关,如果你不懂递归,用啥都做不出。

#5


请教一个Linq查询树结构问题原来范冰冰是负责5楼WC的啊

#6


在你的“查询第一层的数据库”下面写一个foreach语句,就可以了!

引用 5 楼 h598937749 的回复:
请教一个Linq查询树结构问题原来范冰冰是负责5楼WC的啊


只要你将来有了“*”(不用整天上班打卡),这个可以有啊。

#7


如果不用linq我应该可以实现,就像我现在的treeview那样显示,我只是想学下linq

#8


不写出迭代搜索(返回IEnumerable<T>的那个方法),你如何linq?

#9


类似这样的foreach嵌套是吧 请教一个Linq查询树结构问题

#10


TreeItemSource这个集合里面已经有的数据源,连接服务器后把所有的对象都搜索出来了,我就是想用Linq在这个集合中匹配关键字的对象出来

#11


呵呵,重新学习一下数据结构里边的树搜索。而这种搜索在c#里边的语法,可以参考我写的 GetDepartments 方法。

#12


许多人写程序的思维,可能就是“画个流程图,然后分步实施”的学生思路。

而.net开发中许多有意义的设计模式是用来给你分层的。“迭代器”就是其中之一。

分层了的代码,对于不懂的人可能更加看不懂。但是对于理解分层的初衷的人,则可以把复杂的逻辑一下子变得特别简单。“分层”是那种仅仅“分步实施”的思路所不能达到的。

如果你看到一个人写的复杂程序很少有多余的if..else分支结构,那么你应该看看他是不是有分层架构做理论支持。

#13


请教一个Linq查询树结构问题
刚刚用LINQ to DataSet重写了递归树。。。
一上来就看到这贴。。。这么巧么?

#14


兄台对我这个有什么感想?

#15


引用 14 楼 h598937749 的回复:
兄台对我这个有什么感想?


方法1(子ID)
{
   找出所有“子ID”的项目,
   foreach(孙项 in 查出结果)
  {
     树中.add(方法1(孙ID));
  }
}
//方法可以且最好带返回值的,这个“回环”比较难解释,看看应该明白。