Явная загрузка не загружает связанные объекты (список в списке) - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь загрузить от уже найденного пользователя список друзей и из списка друзей и загрузить для каждого списка сообщений.

не работает Загружать только друзей, не загружать сообщения вкаждый френд

_context.Entry (ldetails) .Collection (p => p.ListFriends) .Query ().Include (r => r.MessagesDetails) .Load ();

Моя структура данных

public class RegistrationUser
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int PMId { get; set; }
        [Required]
        [Column(TypeName ="varchar(16)")]
        public string UserName { get; set; }
        [Required]
        [Column(TypeName = "varchar(16)")]
        public string Password { get; set; }
        [Column(TypeName = "varchar(480)")]
        public string Token { get; set; } 


        public ICollection<ListFriend> ListFriends { get; set; }


        public RegistrationUser()
        {
            ListFriends = new List<ListFriend>();

        }
    }

public class ListFriend
    {
        [Key,Column(Order = 0)]

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }    
        [Required]
        [Column(TypeName ="varchar(16)")]
        public string UserFriendName { get; set; }



        public ICollection<MessagesDetail> MessagesDetails { get; set; }

        public ListFriend()
        {

            MessagesDetails = new List<MessagesDetail>();
        }


    }

public class MessagesDetail
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

        [Key,Column(Order = 0)]
        public int PMIdMes     { get; set; }
        [Required]
        [Column(TypeName ="nvarchar(240)")]
        public string  TextMessage{ get; set; }
        [Required]
        [Column(TypeName = "varchar(16)")]
        public string SenderUser { get; set; }
        [Required]
        [Column(TypeName = "varchar(16)")]
        public string CatcherUser { get; set; } 
    }

Это мой метод не работает

[HttpPost("EnterUserDetail")]
        public async Task<ActionResult<RegistrationUser>> postUserDetail( RegistrationUser registrationUser )
        {



            var ldetails = _context.RegistrationUsers.SingleOrDefault(c=>c.UserName==registrationUser.UserName);
            var pdetails = _context.RegistrationUsers.SingleOrDefault(c=>c.Password==registrationUser.Password);

            if (ldetails == null && pdetails == null)
            {
                return NotFound();
            }

            //_context.Entry(ldetails).Collection("ListFriends").Load();


            _context.Entry(ldetails).Collection(p=>p.ListFriends).Query().Include(r=>r.MessagesDetails).Load();
            //_context.Entry(ldetails).Collection("ListFriends").IsLoaded = true;

            //await _context.SaveChangesAsync();
            return ldetails;

        }

1 Ответ

0 голосов
/ 31 марта 2019

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

[HttpPost("EnterUserDetail")]
public async Task<ActionResult<RegistrationUser>> postUserDetail( RegistrationUser registrationUser)
{
    // send one query to database to get the result and include here.
    var ldetails = _context.RegistrationUsers.Include(i => i.ListFriends).SingleOrDefault(c => c.UserName == registrationUser.UserName && c.Password == registrationUser.Password);

    if (ldetails == null && pdetails == null)
    {
        return NotFound();
    }

    return ldetails;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...