Как улучшать эти консультации с entity framework?

я осуществляю относительно простую функциональность чата, использую signalr и entity framework. Моя главная проблема состоит в том, чтобы предотвращать многообразные призывы к базе данных поэтому я хочу улучшить код получения чатов.

Восток - моя модель:

public class Chat
{
    [Key]
    public int ChatID { get; set; }
    [Required]
    public DateTime FechaCreacionChat { get; set; }
    public List<Mensaje> Mensaje { get; set; }
}
public class GroupChat: Chat
{
    [StringLength(25)]
    [Required]
    public string NombreGroupChat { get; set; }
    public List<UsersChat> UsersGroupChat { get; set; }
    public string ImagenGroupChat { get; set; }
}
public class PrivateChat: Chat
{
    public string Usuario1Id { get; set; }
    public string Usuario2Id { get; set; }
    public ApplicationUser Usuario1 { get; set; }
    public ApplicationUser Usuario2 { get; set; }
}

Я использую наследство, чтобы идентифицировать два типа чатов: групповые и частные.

public class Mensaje
{
    [Key]
    public int MensajeID { get; set; }
    [Required]
    public string TextoMensaje { get; set; }
    public DateTime FechaMensaje { get; set; }
    public string NombreArchivoMensaje { get; set; }
    [Required]
    public int ChatId { get; set; }
    [Required]
    public string UsuarioId { get; set; }
    public ApplicationUser Usuario { get; set; }
    public Chat Chat { get; set; }
}
public class UsersChat
{
    [Key]
    public int UsersChatID { get; set; }
    [Required]
    public string UsuarioId { get; set; }
    [Required]
    public int ChatId { get; set; }
    public Chat Chat { get; set; }
    public ApplicationUser Usuario { get; set; }
}

Тогда в этом методе в ChatHub signalr я получаю частные и групповые чаты, в которых находится пользователь:

public async Task GetChats()//no debo obtener todos los chats
    {
        try
        {
            await Task.Run(async () =>
            {
                string name = Context.User.Identity.Name;
                using (var db = new ApplicationDbContext())
                {
                    List<ChatView> listChats = new List<ChatView>();
                    var usuario = await db.Users.SingleAsync(x => x.UserName == name);
                    var chatsPrivate = await db.Chat.OfType<PrivateChat>()
                        .Include(x => x.Usuario1)
                        .Include(x => x.Usuario2)
                        .Where(x => x.Usuario1Id == usuario.Id || x.Usuario2Id == usuario.Id)
                        .ToListAsync();
                    var chatsGroup = await db.UsersChat.Include(x => x.Chat)
                        .Where(x => x.UsuarioId == usuario.Id)
                        .Select(x => x.Chat)
                        .OfType<GroupChat>()
                        .ToListAsync();
                    var gListChats = chatsGroup.Select(chat => new ChatView
                    {
                        ID = chat.ChatID,
                        FechaCreacion = chat.FechaCreacionChat,
                        Nombre = chat.NombreGroupChat,
                        Conectado = false,
                        Mensaje = db.Mensaje.Where(m => m.ChatId == chat.ChatID).Any()?
                                db.Mensaje.Where(m => m.ChatId == chat.ChatID)
                                .OrderByDescending(m => m.FechaMensaje)
                                .Select(x => new MensajeView
                                {
                                    FechaMensaje = x.FechaMensaje,
                                    MensajeID = x.MensajeID,
                                    NombreArchivoMensaje = x.NombreArchivoMensaje,
                                    TextoMensaje = x.TextoMensaje,
                                    Usuario = new UserView
                                    {
                                        Email = x.Usuario.Email,
                                        UserName = x.Usuario.UserName,
                                        PhoneNumber = x.Usuario.PhoneNumber
                                    }
                                })
                                .First()
                                :
                                null,
                        Imagen = "ImageChat?chatId="+chat.ChatID+ "&nameImage=" + chat.ImagenGroupChat
                    });
                    var pListChats =  chatsPrivate.Select(chat => new ChatView
                    {
                        ID = chat.ChatID,
                        FechaCreacion = chat.FechaCreacionChat,
                        Nombre = chat.Usuario1Id == usuario.Id ?
                                chat.Usuario2.UserName
                                :
                                chat.Usuario1.UserName,
                        Mensaje = db.Mensaje.Where(m => m.ChatId == chat.ChatID).Any()?
                                db.Mensaje.Where(m => m.ChatId == chat.ChatID)
                                .OrderByDescending(m => m.FechaMensaje)
                                .Select(x => new MensajeView
                                {
                                    FechaMensaje = x.FechaMensaje,
                                    MensajeID = x.MensajeID,
                                    NombreArchivoMensaje = x.NombreArchivoMensaje,
                                    TextoMensaje = x.TextoMensaje,
                                    Usuario = new UserView
                                    {
                                        Email = x.Usuario.Email,
                                        UserName = x.Usuario.UserName,
                                        PhoneNumber = x.Usuario.PhoneNumber
                                    }
                                })
                                .First()
                                :
                                null,
                        Conectado = chat.Usuario1Id == usuario.Id ?
                                db.Conexion.Any(x => x.UsuarioId == chat.Usuario2Id && x.ConectadoConexion == true)
                                :
                                db.Conexion.Any(x => x.UsuarioId == chat.Usuario1Id && x.ConectadoConexion == true),
                        Imagen = chat.Usuario1Id == usuario.Id ?
                            "ImagenPerfil?nameImage=" + chat.Usuario2.ImagenPerfil + "&name=" + chat.Usuario2.UserName
                            :
                            "ImagenPerfil?nameImage=" + chat.Usuario1.ImagenPerfil + "&name=" + chat.Usuario1.UserName
                    });
                    listChats.AddRange(gListChats);
                    listChats.AddRange(pListChats);
                    listChats.OrderByDescending(x => x.Mensaje.FechaMensaje);
                     await Clients.Caller.setChats(listChats);
                }
            });
        }
        catch (Exception e)
        {
            await Clients.Caller.showErrorMessage($"Se ha Producido un error en ChatHub => GetChats : \n{e.Message}\n{e.InnerException}");
        }
    }

esta функционируя, но я подозреваю, что я делаю больше вызовов необходимых например aveces, должен делать один Any() чтобы знать, существует ли он, и если он состоит в том, чтобы делать так консультацию, иначе я помещаю null, чтобы предотвращать исключение, когда я звоню в First() или Single(). Пример:

Mensaje = db.Mensaje.Where(m => m.ChatId == chat.ChatID).Any()?
                                db.Mensaje.Where(m => m.ChatId == chat.ChatID)
                                .OrderByDescending(m => m.FechaMensaje)
                                .Select(x => new MensajeView
                                {
                                    FechaMensaje = x.FechaMensaje,
                                    MensajeID = x.MensajeID,
                                    NombreArchivoMensaje = x.NombreArchivoMensaje,
                                    TextoMensaje = x.TextoMensaje,
                                    Usuario = new UserView
                                    {
                                        Email = x.Usuario.Email,
                                        UserName = x.Usuario.UserName,
                                        PhoneNumber = x.Usuario.PhoneNumber
                                    }
                                })
                                .First()
                                :
                                null

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

Это - то, что я показываю клиенту:

Diseño web

5
задан 02.03.2019, 04:52
0 ответов