Пользователи и соответствующие роли и показать вид


У меня есть 3 таблицы. Пользователи, роли и RolesToUsers

Здесь User модель:

public partial class User
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public User()
    {
        this.UserToRoles = new HashSet<UserToRole>();
    }

    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<UserToRole> UserToRoles { get; set; }
}

Здесь Role модель:

public partial class Role
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Role()
    {
        this.UserToRoles = new HashSet<UserToRole>();
    }

    [Key]
    public int Id { get; set; }
    public string RoleName { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<UserToRole> UserToRoles { get; set; }
}

И вот UserToRole модель:

public partial class UserToRole
{
    [Key]
    public int Id { get; set; }
    [ForeignKey("Role")]
    public Nullable<int> RoleId { get; set; }
    [ForeignKey("User")]
    public Nullable<int> UserId { get; set; }

    public virtual Role Role { get; set; }
    public virtual User User { get; set; }
}

Мне нужно показать всем пользователям и связанные с ним ролями.

Я пишу этот метод РЕПО

public List<UserViewModel> GetUsers()
{
    var users = db.Users
        .Include(u => u.UserToRoles.Select(ur => ur.Role))
        .Select(u => new UserViewModel
        {
            UserName = u.Name,
            Roles = u.UserToRoles.Select(ur => ur.Role.Name)
        })
        .ToList();

    return users;
}

После этого мне нужно показать данные из базы данных в следующем формате Ronald - Admin,User, где Рональд и т. д. имя пользователей, после - это роли, связанные с пользователем.

Способ РЕПО работает отлично

И я покажу это с помощью этого кода.

function GetUsers() {
let url = "/Home/GetUsers";
$.ajax({
    type: 'GET',
    url: url,
    dataType: 'json',
    success: function (data) {
        var separator = "";
        for (var i = 0; i < data.length; ++i) {
            var userRow = data[i].UserName + " - " + data[i].Roles.join(", ");

            $('#taskresult3').append(separator + userRow);
            separator = ",";
        }
    }
});

Какие-либо предложения или улучшения, я могу сделать, чтобы этот код?



147
0
задан 12 февраля 2018 в 09:02 Источник Поделиться
Комментарии
1 ответ

partial Это предназначается, чтобы использоваться, когда класс охватывает несколько файлов, не когда класс должен быть продлен. Если вы хотите использовать virtual нет необходимости, чтобы пометить класс как partial если он действительно существует в нескольких файлах (плохой дизайн по большей части все равно, с несколько хороших целей). Если вы хотите заставить классе передаются по наследству, использовать abstract вместо partial.

Вы можете удалить конструктор по умолчанию (и предупреждение подавления) с использованием значений по умолчанию:

public class User
{
[Key]
public int Id { get; set; }
public string Name { get; set; }

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<UserToRole> UserToRoles { get; set; } = new HashSet<UserToRole>();
}

Сейчас это функционально то же самое, но меньше кода.

И nullable свойства могут также быть определен стенографии:

public class UserToRole
{
[Key]
public int Id { get; set; }
[ForeignKey("Role")]
public int? RoleId { get; set; }
[ForeignKey("User")]
public int? UserId { get; set; }

public virtual Role Role { get; set; }
public virtual User User { get; set; }
}

В int? фактически же, как Nullable<int>это немного легче на глаза без необходимости разбирать дженериков.

Последний комментарий о вашем методе РЕПО. Его можно было бы сократить немного:

public List<UserViewModel> GetUsers()
{
return db.Users
.Include(u => u.UserToRoles.Select(ur => ur.Role))
.Select(u => new UserViewModel
{
UserName = u.Name,
Roles = u.UserToRoles.Select(ur => ur.Role.Name)
})
.ToList();
}

Или, если вы действительно хотите, чтобы сократить его:

public List<UserViewModel> GetUsers() => db.Users
.Include(u => u.UserToRoles.Select(ur => ur.Role))
.Select(u => new UserViewModel
{
UserName = u.Name,
Roles = u.UserToRoles.Select(ur => ur.Role.Name)
}).ToList();

Единственная причина, я хотел бы использовать промежуточными users переменную в метод, чтобы сделать отладку внутри метода. Можно добавить точку останова на return users; линии и отладки значение. Если вы не уверены в операции запроса и результаты, сокращая это помогает с сохранением кода.

1
ответ дан 13 февраля 2018 в 04:02 Источник Поделиться