Sha*_*awn 5 c# sql linq common-table-expression linq-to-sql
我有一个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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
2个问题:
IEnumerable <Comment>
IEnumerable <Comment>
,只有Comment
它本身?我可能会使用 UDF/CTE,或者(对于非常深的结构)手动执行相同操作的存储过程。
请注意,如果您可以更改模式,您可以将此类递归结构预先索引到索引/范围树中,该树允许您执行单个 BETWEEN 查询 - 但树的维护成本很高(即查询变得便宜,但插入/更新/delete 变得昂贵,或者你需要一个延迟的计划任务)。
Re 2 - 您只能yield
使用枚举中指定的类型(/ T
)。IEnumerable<T>
IEnumerator<T>
如果该方法返回,您可以yield
知道- 这有意义吗?IEnumerable<Comment>
IEnumerable<IEnumerable<Comment>>
改进:
using
,因为DataContext
是IDisposable
...所以:
using(var db = new MyDataContext() ) { /* existing code */ }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4975 次 |
最近记录: |