从另一个匹配 guid 数组的列表中返回 ID 所在的项目筛选列表

Returning a filtered list of items from where the ID is in a list from another array of matching guids

提问人:Gavin Clayton 提问时间:11/16/2023 更新时间:11/16/2023 访问量:29

问:

经过一些帮助,使用另一个项目列表过滤列表。通常我会在 SQL 中对此进行编码,但我需要尝试在 .NET 中使其正常工作。 我有一个角色列表,每个角色在每页的基础上都有一组权限,用户也是一组角色的成员,这些角色就是过滤器。我试图了解各种帮助文件,但没有一个有我能找到的这种格式的示例。

Partial Class TestUsers
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Roles.Role = New List(Of Role)
        Roles.Role.Add(New Role(New Guid("EAC49E8F-BF55-44FD-BE69-5BBF7B5F289A"), "Admin", 0))
        Roles.Role.Add(New Role(New Guid("A174A3ED-17F8-4450-9B25-3D2A21FCDDFF"), "User", 0))
        Roles.Role.Add(New Role(New Guid("5780C40C-111A-4B4D-AA20-80E944B6B67A"), "Anon", 0))
        Roles.Role.Add(New Role(New Guid("7E1DC89C-4B9C-49F8-9A37-0FA22A7C8116"), "HR", 0))

        Dim UserPermission As New List(Of Role)
        UserPermission.Add(Roles.GetRoleByID(New Guid("EAC49E8F-BF55-44FD-BE69-5BBF7B5F289A")))
        UserPermission.Add(Roles.GetRoleByID(New Guid("A174A3ED-17F8-4450-9B25-3D2A21FCDDFF")))

        Dim PagePermission = RolePermission.GetPermissionFromString("Admin:1,1,1;User:1,0,0;Data:1,0,0;")
        Dim FilteredList = PagePermission.Where(Function(i) UserPermission.Contains(i.Role)).ToList
        Response.Write(FilteredList(0).Role.RoleName)

        Response.Write(UserPermission.Count())
        Response.Write("<br>")
        Response.Write(PagePermission.Count())
        Response.Write("<br>")
        Response.Write(FilteredList.Count())
    End Sub
    Public Class RolePermission
        Public Role As Role
        Public Read As Boolean
        Public Edit As Boolean
        Public Admin As Boolean
        Public Sub New(Role As Role, Read As String, Edit As String, Admin As String)
            Me.Role = Role
            Me.Read = Read
            Me.Edit = Edit
            Me.Admin = Admin
        End Sub
        Public Shared Function GetPermissionFromString(Permission As String) As List(Of RolePermission)
            Dim u As New List(Of RolePermission)
            If Permission = "" Then Permission = "Anon:0,0,0;"
            Dim l As String() = Permission.TrimEnd(";").Split(";")
            For Each s In l
                If Not IsNothing(s.Split(":")) Then
                    u.Add(New RolePermission(Roles.GetRoleByName(DbStr(Permission.Split(":")(0))), s.Split(":")(1).Split(",")(0), s.Split(":")(1).Split(",")(1), s.Split(":")(1).Split(",")(2)))
                End If
            Next
            Return u
        End Function
    End Class
    Public Class Role
        Public RoleID As Guid
        Public RoleName As String
        Public SiteGroupID As Integer
        Public Sub New(RoleID As Guid, RoleName As String, SiteGroupID As Integer)
            Me.RoleID = RoleID
            Me.RoleName = RoleName
            Me.SiteGroupID = SiteGroupID
        End Sub
    End Class
    Public Class Roles
        Public Shared Role As List(Of Role)
        Public Shared Function GetRoleByID(RoleID As Guid) As Role
            Return Role.Find(Function(s) s.RoleID = RoleID)
        End Function
        Public Shared Function GetRoleByName(RoleName As String) As Role
            Return Role.Find(Function(s) s.RoleName = RoleName)
        End Function
    End Class
End Class

过滤后的列表返回 3,它应该是 2。

Dim FilteredList = PagePermission.Where(Function(i) UserPermission.Contains(i.Role)).ToListResponse.Write(FilteredList(0).Role.RoleName)
列出 LINQ 筛选器 WHERE-子句 vb.net

评论

0赞 T N 11/16/2023
当我阅读您的帖子时,您的预期计数是 2,但您实际上得到了 3。这是对的吗?我扫描了代码,没有看到任何明显的东西,但确实有几个问题:由于 Roles 集合中没有“数据”角色,因此返回什么?零?= 2 还是 3?结果是什么?如果“数据”条目不是问题。我建议您尝试在各种集合中添加和删除数据值,直到您隔离问题。FilteredList.Count()GetRoleByName("Data")PagePermission.Count()UserPermission.Contains(null)
0赞 Gavin Clayton 11/16/2023
是的,这是错别字,基本上接受输入,只返回与用户角色匹配的页面的权限。

答:

1赞 Darryl 11/16/2023 #1

中有一个错误。你在哪里,它应该是.RolePermission.GetPermissionFromString()DbStr(Permission.Split(":")(0))DbStr(s.Split(":")(0))

评论

0赞 Gavin Clayton 11/16/2023
干杯达里尔,有时只需要第二只眼睛就能发现这些东西!
0赞 jmcilhinney 11/16/2023
@GavinClayton,这似乎是调试时应该捡到的东西。许多初学者不知道如何调试,甚至不知道这是他们需要做的事情。如果是你,你应该停止你正在做的事情,现在学习如何调试。单步执行该代码并检查每个引用会显示这不是您期望的值。