C# Linq2SQL和复活树输出

C# Linq2SQL和复活树输出,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,考虑一个树状结构,其中树只包含一个表daTree,其中包含intID、intParentID和strValue字段。字段intParentID是可选的,空值表示条目是树的根(可能有很多) 我希望Linq以以下形式将所有条目返回给SQL Root1 Root1-Child1 Root1-Child2 Root1-Child2-Child1 ... Root2 因此写了下面的枚举器 IEnumerable<daTree> RecGetTree(daTree tr

考虑一个树状结构,其中树只包含一个表daTree,其中包含intID、intParentID和strValue字段。字段intParentID是可选的,空值表示条目是树的根(可能有很多)

我希望Linq以以下形式将所有条目返回给SQL

Root1
  Root1-Child1
  Root1-Child2
    Root1-Child2-Child1
    ...
Root2
因此写了下面的枚举器

IEnumerable<daTree> RecGetTree(daTree tree, DataContext context) {
    int? parentID = null;
    if (tree != null) {
        parentID = tree.intID;
        yield return tree; //emit current tree
    }
    IEnumerable<daTree> trees = context.daTrees
        .Where(t => t.intParent == parentID)
        .OrderBy(t => t.strName)
        .SelectMany(t => RecGetTree(t, context));
    foreach(var child in trees)
        yield return child;
}
IEnumerable RecGetTree(数据树,数据上下文){
int?parentID=null;
如果(树!=null){
parentID=tree.intID;
产生返回树;//发出当前树
}
IEnumerable trees=context.daTrees
.Where(t=>t.intParent==parentID)
.OrderBy(t=>t.strName)
.SelectMany(t=>RecGetTree(t,context));
foreach(树中的子变量)
退换子女;
}
最初使用null和Linq2SQL数据上下文调用

我的问题是,
yield-return子级出现异常

发生“System.NotSupportedException”类型的第一次意外异常 在System.Data.Linq.dll中的其他信息:方法 'System.Collections.Generic.IEnumerable'1[MyProject.daTree] RecGetTree(MyProject.daTree,MyProject.DataContext)“”不受支持 转换为SQL


你知道我怎样重写代码才能让它工作吗?我使用的是VS 2013和.Net 4.5。

您可以更早地强制计算LINQ表达式

IEnumerable<daTree> trees = context.daTrees
    .Where(t => t.intParent == parentID)
    .OrderBy(t => t.strName).ToList() // <-- here
    .SelectMany(t => RecGetTree(t, context));
IEnumerable trees=context.daTrees
.Where(t=>t.intParent==parentID)
.OrderBy(t=>t.strName).ToList()//RecGetTree(t,context));

它不会特别有效,但至少应该能工作。

谢谢,这很有效!您是否有任何关于高效解决方案的建议?要使其高效,您可以缓存整个daTrees表(如果它是一个相当小的表),否则您需要求助于CTE服务器端,并且不能直接用LINQ表示CTE。