订购列表中的项目子集

时间:2012-01-27 20:18:11

标签: sql vb.net sql-order-by union listitem

我需要点子......

我有一个扭曲的经典场景,包含以下表格: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来为每个列表项设置样式,具体取决于它是否是给定角色的成员。 >。<

谢谢:)

1 个答案:

答案 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