当前位置: 首页 > 面试题库 >

Linq-to-Sql:递归获取子级

慕河
2023-03-14
问题内容

我有一个Comment表,其中有一个CommentID和ParentCommentID。我正在尝试获取评论的所有子级的列表。到目前为止,这是我到目前为止尚未完成的测试

private List<int> searchedCommentIDs = new List<int>();
// searchedCommentIDs is a list of already yielded comments stored
// so that malformed data does not result in an infinite loop.
public IEnumerable<Comment> GetReplies(int commentID) {
    var db = new DataClassesDataContext();
    var replies = db.Comments
        .Where(c => c.ParentCommentID == commentID 
            && !searchedCommentIDs.Contains(commentID));
    foreach (Comment reply in replies) {
        searchedCommentIDs.Add(CommentID);
        yield return reply;
        // yield return GetReplies(reply.CommentID)); // type mis-match.
        foreach (Comment replyReply in GetReplies(reply.CommentID)) {
            yield return replyReply;
        }
    }
}

2个问题:

  1. 有什么明显的方法可以改善这一点吗?(此外,也许还可以使用CTE在sql中创建视图。)
  2. 我怎么不能只IEnumerable <Comment>给一个IEnumerable屈服呢?<Comment>``Comment
  3. 无论如何,在这种情况下可以使用SelectMany吗?

问题答案:

我可能会使用UDF / CTE或(对于非常深的结构)使用手动执行相同操作的存储过程。

请注意,如果您可以更改架构,则可以将此类递归结构预先索引到索引树/范围树中,该树使您可以执行单个BETWEEN查询-
但树的维护成本很高(即查询变得便宜,但是插入/更新/删除变得昂贵,或者您需要延迟的计划任务)。

关于2-您只能yield使用枚举中指定的类型(Tin IEnumerable<T>/ IEnumerator<T>)。

你可以yieldIEnumerable<Comment> ,如果
该方法返回IEnumerable<IEnumerable<Comment>>-这是否合理?

改进之处:

  • 也许是使用CTE递归方法的 udf (用于保持可组合性,而不是存储过程)
  • 使用using,因为DataContextIDisposable

所以:

using(var db = new MyDataContext() ) { /* existing code */ }
  • LoadWith值得一试,但是我不确定我会不会有希望…
  • 搜索的ID列表作为一个字段是有风险的-只要您不两次调用它,我想您就可以了…就我个人而言,我会在私有支持方法上使用一个参数…(即,将在递归调用之间列出,但不在公共API上列出)


 类似资料:
  • 问题内容: 有没有可以将SQL语法转换为LINQ语法的工具? 我只想用join等将基本查询重写为LINQ。这样可以节省很多时间。 问题答案: 编辑7/17/2020:我无法删除这个已接受的答案。它曾经是很好的,但现在不是。伙计们,要当心真正的老帖子。我正在删除链接。 [ Linqer ]是将SQL转换为LINQ的工具。它可以帮助您学习LINQ并转换现有的SQL语句。 并非每个SQL语句都可以转换为

  • 问题内容: 给出下表: 我想产生一个单列/行: 我可以在SQL中执行以下操作: 但是我不知道如何在LINQ中做到这一点。 我最接近的是: 产生一列两行: 转换对于这个问题并不重要。尽管所有列都是整数,但这些列被定义为浮点数。关键是COALESCE函数,我无法弄清楚如何在LINQ中做到这一点。 问题答案: 我不认为LINQ to SQL支持此T-SQL技巧。COALESCE并不是真正的问题(正如Me

  • 问题内容: 我有一张桌子 我填写这个表 选择idFolder = 1的文件夹时,应返回该文件夹和子子文件夹的所有子文件夹(2,3,4,5,6,7) 当我选择文件夹ID = 4 ==>(5,7,6) 当我选择文件夹ID = 3 ==>(4,5,6,7) 一个查询该怎么做? 谢谢 问题答案: 这是工作中的一个 在此处查看SQL固件:http://sqlfiddle.com/#!2 / 02b78 /

  • 问题内容: 我对此进行了一些研究,并浏览了StackOverflow上的一些文章以及一些博客文章,但是没有找到确切的答案。我还读到可以使用4.0框架来实现,但尚未找到任何支持证据。 所以我的问题是,是否可以通过LINQ to SQL查询执行SOUNDEX? 问题答案: 您可以通过使用伪造的UDF在数据库上执行此操作;在部分类中,向数据上下文添加一个方法: 您可以使用像这样的表达式:

  • 问题内容: 鉴于此LINQ to SQL: 如果使用相同的rootPostId再次调用同一方法(此代码所在的位置)并发更改同一记录,将会发生什么情况?会抛出异常吗? 在这种情况下(并发冲突),我想通过简单地放弃所做的更改来处理它,以便仅提交对LastActivityUtc的一个更新,而不是同时提交这两个更新,无论如何更新都将具有相同的值。 问题答案: 您可以通过捕获ChangeConflictEx

  • null null 表名: ISBN->外键 authorid->外键 既然Linq-to-SQL会根据外键关系自动创建属性,为什么下面的代码块不会触发智能感知呢?对我来说不是... 它不允许我添加照片,但“author”与AuthorISBN有“一对多”关系,“titles”也与AuthorISBN有“一对多”关系 代码: