#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);