我需要点子......
我有一个扭曲的经典场景,包含以下表格:Users,Roles,UsersInRoles。
在我的网页中,我有一些Comboboxes(即DropDownList + TextBox),每个角色一个,其中包含该特定角色的所有用户。我希望他们每个人都包含的是所有用户的完整列表,但是如此分组和排序......
我一直在尝试使用一些SQL和VB来尝试解决方案,但目前尚不清楚哪种方法是最佳方法,也不知道如何全面实施解决方案。我只想出了一点点零碎。请原谅我现在不发布任何代码。我希望有一些新想法和一个聪明的解决方案,不会对服务器提出太多要求。
为了帮助您提供相关建议,请参阅我的表格结构:
Users (ID, Username, Name)
Roles (ID, Role)
UsersInRoles (ID, UserID, RoleID)
我写的那个查询给了我所需的所有子组,我想到的地方。
select u.ID, Name, RoleID from UsersInRoles
inner join Users u on UserID = u.ID --This is only to return a name rather than ID
order by ReviewerRoleID, Name
使用Tim的建议,我可以使用这样的一些代码隐藏来绑定到每个相应的下拉列表。我所担心的一个问题是,我正在为每个角色执行查询,这会在每次用户访问页面时对服务器造成潜在负担。
Private Sub PopulateUserInRoleCombobox(ByVal key As Integer, ByVal ddl As DropDownList)
Try
Dim dt As New DataTable
Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("tcomConnectionString").ConnectionString)
Dim spSelect As New SqlCommand("spGetUserInRoleList", connection)
spSelect.CommandType = CommandType.StoredProcedure
Dim RoleID As New SqlParameter("@GivenRoleID", SqlDbType.Int)
RoleID.Value = key
spSelect.Parameters.Add(RoleID)
Dim da As New SqlDataAdapter(spSelect)
da.Fill(dt)
End Using
ddl.DataSource = dt
ddl.DataBind() 'Bind results to the DropDownList
Catch ex As Exception
'Error Message
End Try
End Sub
最后一步是弄清楚如何最好地编写Javascript来为每个列表项设置样式,具体取决于它是否是给定角色的成员。 >。<
谢谢:)
答案 0 :(得分:1)
我认为这是你的T-SQL(如果使用SQL-Server)
;WITH UserRoles AS(
SELECT U.UserName
,R.RoleName
,Row_Number()Over(Order By CASE WHEN R.RoleID= @GivenRoleID THEN 0 ELSE 1 END,UserName)As SortOrder
,Row_Number()Over(Partition By UserName Order By CASE WHEN R.RoleID= @GivenRoleID THEN 0 ELSE 1 END,RoleName)As UserRoleNumber
FROM Users AS U INNER JOIN
UsersInRoles ON U.UserId = UsersInRoles.UserId INNER JOIN
Roles AS R ON UsersInRoles.RoleId = R.RoleId
)
SELECT UserName,RoleName
FROM UserRoles
WHERE UserRoleNumber=1
ORDER By SortOrder
这是通过ADO.NET检索数据的一种方法:
Public Shared Function GetUsers(forRoleID As Guid) As DataTable
Dim tblUser As New DataTable
Using sqlCon As New SqlClient.SqlConnection(My.Settings.ConnectionString)
Dim sqlCmd = New SqlClient.SqlCommand()
sqlCmd.CommandType = CommandType.StoredProcedure
sqlCmd.CommandText = "dbo.spGetUserInRoleList"
sqlCmd.Connection = sqlCon
sqlCmd.Parameters.AddWithValue("@GivenRoleID", forRoleID)
Using objAdapter As New SqlClient.SqlDataAdapter(sqlCmd)
Try
objAdapter.Fill(tblUser)
Catch ex As Exception
' log exception etc. '
End Try
End Using
End Using
Return tblUser
End Function