【发布时间】:2017-08-24 21:29:50
【问题描述】:
我有一个从返回文件夹层次结构的存储过程构建的菜单。该过程返回 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": {}
您可以看到 SubFolders 存在两次,因为初始查询得到 All Folders。如何从列表中删除作为子文件夹的文件夹?另外,我很想看看是否有更有效的方法来创建这个菜单结构,但请记住,我必须使用存储过程,因为授权逻辑已经在那里构建。
这是我没有做任何事情的微弱尝试:
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; }
【问题讨论】:
-
您想从样本中删除哪个
SubFolder 1.1?第一个还是第二个? 请附上UserMenuFolders的源代码。 -
第二个。如果文件夹在 ForEach 之后变成了子文件夹,我想删除它。
标签: c# linq linq-to-sql entity-framework-core