2012-01-27 55 views
0

我需要的想法...排序列表中的项目的子集

我有一个扭曲的经典场景,包含以下表:用户,角色,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的造型取决于每个项目,如果是给定的角色或不是的成员。 >。 <

谢谢:)

回答

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 
+0

感谢蒂姆,你能不能说清了一下好吗?把你的建议映射到我的数据库的结构有点麻烦。另外,这对我的总体目标没有帮助。我会很感激,如果你可以重新读我的问题:( – Chiramisu 2012-01-27 20:47:49

+0

你没有提及什么样的结构或事件你使用的是什么样的dbms所以我假设SQL-Server和使用默认结构时,使用SQL成员资格提供者这个sql-query返回所有的用户名和他们的角色,顺序为1.给定的RoleID作为SqlParameter 2.用户名。因此,属于某个特定组的用户将首先(按他们的名字进行排序)。不属于这个组的用户如下(按他们的名字进行排序)。没有重复的用户(由'WHERE UserRoleNumber = 1'引起)。当前组将始终列出(如果用户属于该组)。 – 2012-01-27 21:10:25

+0

我非常喜欢这个解决方案,以获取我的数据,出色的性能。现在,如果你只能帮我提供一些关于如何将这些内容整合到我的VB.NET代码中的想法,那将是完美的。我会编辑我的答案以包含我的想法。谢谢:) – Chiramisu 2012-01-27 21:13:12