Упорядочение подмножеств элементов в списке - PullRequest
0 голосов
/ 28 января 2012

Мне нужны идеи ...

У меня есть классический сценарий с поворотом, содержащий следующие таблицы: Users, Roles, UsersInRoles.

На моей веб-странице у меня есть несколько комбинированных списков (т.е.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

Используя рекомендацию Тима, я могу использовать некоторый код, подобный этому, для привязки к каждомусоответствующий выпадающий список.Единственное, что меня беспокоит, это то, что я выполняю запрос для каждой роли, который создает потенциальную нагрузку на сервер каждый раз, когда пользователь получает доступ к странице.

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 для стилизации каждого элемента списка в зависимости от того, является ли он членом данной роли или нет.>. <</p>

Спасибо:)

1 Ответ

1 голос
/ 28 января 2012

Я предполагаю, что для вас это T-SQL (если используется SQL-сервер)

;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
...