抓住用户个人资料中的特定值

时间:2020-03-05 18:56:51  来源:igfitidea点击:

我在vb .net应用程序中使用成员身份和角色进行身份验证。我们在应用程序中大约有5个角色,其中某些角色填写了特定的配置文件值。例如,角色是商店,配置文件值是商店编号。显然,如果我们在总部工作,则没有门店号码,所以我不在乎。每个商店也可以拥有1名以上的员工。

我需要让用户获得特定的商店编号。这意味着我只希望属于商店编号101的用户显示该列表。我们现在这样做的方式是遍历所有用户,并将符合条件的用户添加到排序列表中。此功能有效,但问题是当我们开始传递大约3,000个用户时。做任何事情都会变得缓慢。

你们将如何找到一种不同的方式呢?我真的不想做自定义存储过程或者更改基础类,因为我担心所有这些都会破坏更高版本的.net,因为它们会更改成员资格和角色。

解决方案

回答

我们使用的是内置的.NET角色管理器,我将其保存到SQL Server实例中了吗?当我们当前正在查看用户对象以评估标准时,用户对象使用哪种格式?如果我们发布代码示例,我有个主意...

回答

这确实是我们要在SQL中进行过滤的一种东西。我认为没有任何技巧可以绕过对数据进行线性扫描并获得所需的结果。

如果无法在SQL中执行此操作,那么也许可以避免创建第二个列表,而仅对主用户数组进行排序,并使显示内容仅显示我们关注的列表。这样至少可以节省内存复制时间。

回答

Public Shared Function LoadALLUsersInRole(ByVal Code As Integer, ByVal Role As String) As ArrayList
        Dim pb As ProfileBase
        Dim usersArrayList As New ArrayList
        Dim i As Integer
        Dim AllUsersInRole() As String = Roles.GetUsersInRole(Role)

        For i = 0 To AllUsersInRole.Length - 1

            pb = ProfileBase.Create(AllUsersInRole(i), True)

            'Check to see if the current user in the collect belongs to this Store.
            If CType(pb.GetPropertyValue("Store.Code"), Integer) = Code Then                    
                    usersArrayList.Add(AllUsersInRole(i))                   
            End If
            pb = Nothing
        Next

        Return usersArrayList
    End Function

那是我如何做的示例代码。我不想在SOL方面这样做的原因是,我将非常依赖成员资格和角色不变的事实。