Явная загрузка не загружает связанные объекты (список в списке)

#c# #.net #entity-framework #.net-core

#c# #.net #entity-framework #.net-ядро

Вопрос:

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

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

_context.Запись (ldetails).Коллекция (p=>p.ListFriends).Запрос(). Включить(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 amp;amp; 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. Неясно, что «не работает».

Ответ №1:

На самом деле вы делаете 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 amp;amp; c.Password == registrationUser.Password);

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

    return ldetails;
}
  

Комментарии:

1. Да, thk. правильно будет: var ldetails = _context.RegistrationUsers. Включить (i => i.ListFriends). Затем включить(z=>z.MessagesDetails). SingleOrDefault(c => c.UserName == registrationUser.UserName amp;amp; c.Password == registrationUser.Password);