Я не могу получить сообщение из базы без загрузки всего сообщения - PullRequest
0 голосов
/ 04 апреля 2019

Сначала я загрузил все сообщения из базы данных. Затем я выбрал то, что мне нужно.

Но это не правильно загрузить все.

var ldetails = _context.RegistrationUsers.Include (i => i.ListFriends) .ThenInclude (z => z.MessagesDetails) .SingleOrDefault (c => c.UserName == Context.User.Identity.Name);

Я хотел загрузить только одно сообщение по критерию, но постоянно получаю сообщение об ошибке. Пожалуйста, покажи мне, как это сделать.

Я пробовал

var ldetails = _context.RegistrationUsers.Include(i => i.ListFriends).ThenInclude(z=>z.MessagesDetails.SingleOrDefault(g=>g.TextMessage == messagesDetail.TextMessage)).SingleOrDefault(c => c.UserName == Context.User.Identity.Name);

Но я получаю ошибку (

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; } 
}


//My method

[Authorize]
public async Task DeleteMessage(string frend ,MessagesDetail 
messagesDetail)
        {

            var ldetails = _context.RegistrationUsers.Include(i => 
            i.ListFriends).ThenInclude(z=>z.MessagesDetails.
 SingleOrDefault(g=>g.TextMessage == messagesDetail.TextMessage)).
 SingleOrDefault(c => c.UserName == Context.User.Identity.Name);


//.....
         }


I expect to receive a message for the condition:

g=>g.TextMessage == messagesDetail.TextMessage;

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019
var pdetails =  _context.RegistrationUsers.SingleOrDefault(c=>c.Password==Context.User.Identity.Name);

            var nlk = _context.Entry(pdetails).Collection(n => n.ListFriends).Query().SelectMany(n => n.MessagesDetails)
                .Where(z => z.TextMessage == messagesDetail.TextMessage).ToList();

ЭТО работает!

0 голосов
/ 04 апреля 2019

Возможно, вы пытаетесь отфильтровать Include или IncludeThen, что не поддерживается. Вам нужно будет создать проекцию, используя Select:

var ldetails = _context.RegistrationUsers.Select(x=>new RegistrationUser
{
  PMId=x.PMId,
  UserName=x.UserName,
  Password=x.Password,
  Token=x.Token,
  ListFriends=x.ListFriends.Select(q => new ListFriend
    {
      UserId=q.UserId,
      UserFriendName=q.UserFriendName,
      MessagesDetails=q.Where(a => a.TextMessage == messagesDetail.TextMessage).ToList()
    }).ToList()              
}).SingleOrDefault(c => c.UserName == Context.User.Identity.Name);

Для получения дополнительной информации посмотрите этот выпуск .

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