EF Linq查找所有子节点或者所有父节点
EF LINQ查询中,有一张表,存放的是级别关系
内容如下,

现在需要根据一个节点查询出所有包含的子节点ID
C# 全选
using System;
using System.Collections.Generic;
using System.Linq;
namespace YESCMS.Libs
{
    public static class EnumerableExtension
    {
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data">结果数据</param>
        /// <param name="dataSource">数据源</param>
        /// <param name="predicate">数据判断是否符合要求,第一个参数为待判断的对象,第二个参数为判断的标准对象(用来判断第一个参数是否符合要求)</param>
        /// <returns></returns>
        public static List<T> GetAll<T>(this IEnumerable<T> data, IEnumerable<T> dataSource, Func<T, T, bool> predicate)
        {
            var _IuserRelation = data.Concat(data.SelectMany(t => getAllChildren(dataSource, t, predicate)));
            return _IuserRelation.ToList();
        }
        private static IEnumerable<T> getAllChildren<T>(IEnumerable<T> Data, T relationObj, Func<T, T, bool> func)
        {
            var query = Data.Where(w => func(w, relationObj));
            return query.Concat(query.SelectMany(t => getAllChildren(Data, t, func)));
        }
    }
}
参数说明
Func<T, T, bool> predicate,第一个对象为循环的对象,要根据第二个对象的值来判断第一个对象是否符合要求,
比如要查询所有子集节点,那么PreDicate应该为
根据节点查询出所有的子节点
C# 全选
var acg = entities.data_ArchiveCategoryGroup.Where(w => w.CategoryNo == Category).ToList();
var p = acg.Where(w => w.GroupCode == Group).GetAll(acg, (obj, reg) => obj.ParentRowID == reg.RowID);
var rowid = p.Select(s => s.RowID).Distinct();测试:
数据源

查找 GroupCode == "normal" 节点 所有的子节点
查找结果

查找结果如图所示

根据节点查询出所有的父节点
C# 全选
var acg = entities.data_ArchiveCategoryGroup.Where(w => w.CategoryNo == Category).ToList();
var p = acg.Where(w => w.GroupCode == Group).GetAll(acg, (obj, reg) => obj.RowID == reg.ParentRowID);
var rowid = p.Select(s => s.RowID).Distinct();测试:
数据源

查找 GroupCode == "fwmanager" 节点 所有的父节点
查找结果

数据视图

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
post 管理员  
 

