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 管理员