gpt4 book ai didi

c# - 使用 Linq 删除同一对象中的子项的父项

转载 作者:太空宇宙 更新时间:2023-11-03 22:54:50 26 4
gpt4 key购买 nike

我有一个从返回文件夹层次结构的存储过程构建的菜单。该过程返回 FolderID、Name 和 ParentID。在我的菜单存储库中,我在文件夹列表中使用 ForEach() 来添加与父文件夹关联的每个子文件夹。

看起来像这样:

folders = await _dbcontext.MenuFolders.FromSql("EXEC UserMenuFolders @p0", UserID)
.Select(x => new MenuFolder
{
FolderID = x.FolderID,
FolderName = x.FolderName,
SortOrder = x.SortOrder,
SubofID = x.SubofID
})
.ToListAsync();

folders.ForEach(x => x.SubFolders = folders
.Where(y => y.SubofID == x.FolderID)
.OrderBy(y => y.SortOrder)
.ToList());

这给了我一个看起来有点像的对象:

 "Folder 1": {
"Sub Folder 1": [
"SubFolder 1.1",
"SubFolder 1.2"
],
"Sub Folder 2": [
"SubFolder 2.1",
"SubFolder 2.2"
]
},
"Folder 2": {
//Other sub Folders
},
"SubFolder 1":{},
"SubFolder 1.1":{},
"SubFolder 1.2": {}

您可以看到子文件夹在那里两次,因为初始查询获取的是所有文件夹。如何从列表中删除作为子文件夹的文件夹?此外,我很想知道是否有更有效的方法来创建此菜单结构,但请记住,我必须使用存储过程,因为授权逻辑已经在那里构建。

这是我无能为力的尝试:

folders.RemoveAll(x => x.SubFolders.Any(c=> c.FolderID == x.FolderID));

下面是我的 MenuFolders 实体:

public int FolderID { get; set; }
public string FolderName { get; set; }
public int ParentID { get; set; }
[ForeignKey("ParentID")]
public List<MenuFolder> SubFolders { get; set; }
public Int16 SortOrder { get; set; }

最佳答案

您的尝试已接近尾声。基本上,您要删除的是子文件夹。这意味着如果文件夹的父 ID 与任何文件夹的 ID 一样存在,则它一定是一个子文件夹,因此您可以安全地删除它。

folders.RemoveAll(x => folders.Any(f => f.FolderID == x.ParentID));

关于c# - 使用 Linq 删除同一对象中的子项的父项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45871185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com