C# 如果不加载所有消息,我无法从数据库中获取消息

C# 如果不加载所有消息,我无法从数据库中获取消息,c#,.net,sql-server,entity-framework,C#,.net,Sql Server,Entity Framework,我首先加载了数据库中的所有消息。然后我选择了我需要的 但它并没有正确加载所有消息 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(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;
公共类注册用户
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int PMId{get;set;}
[必需]
[列(TypeName=“varchar(16)”)]
公共字符串用户名{get;set;}
[必需]
[列(TypeName=“varchar(16)”)]
公共字符串密码{get;set;}
[列(TypeName=“varchar(480)”)]
公共字符串标记{get;set;}
公共ICollection ListFriends{get;set;}
公共注册用户()
{
ListFriends=新列表();
}
}
公共类ListFriend
{
[键,列(顺序=0)]
[数据库生成(DatabaseGeneratedOption.Identity)]
public int UserId{get;set;}
[必需]
[列(TypeName=“varchar(16)”)]
公共字符串UserFriendName{get;set;}
公共ICollection消息详细信息{get;set;
}
公共列表朋友()
{
MessagesDetails=新列表();
}
}
公共类消息详细信息
{
[数据库生成(DatabaseGeneratedOption.Identity)]
[键,列(顺序=0)]
公共整数PMIdMes{get;set;}
[必需]
[列(TypeName=“nvarchar(240)”)]
公共字符串TextMessage{get;set;}
[必需]
[列(TypeName=“varchar(16)”)]
公共字符串SenderUser{get;set;}
[必需]
[列(TypeName=“varchar(16)”)]
公共字符串CatcherUser{get;set;}
}
//我的方法
[授权]
公共异步任务DeleteMessage(字符串法语,MessagesDetail
信息(详细信息)
{
var ldetails=\u context.RegistrationUsers.Include(i=>
i、 然后包括(z=>z.messages详细信息。
SingleOrDefault(g=>g.TextMessage==messagesDetail.TextMessage))。
SingleOrDefault(c=>c.UserName==Context.User.Identity.Name);
//.....
}
我希望收到有关该情况的消息:
g=>g.TextMessage==messagesdeail.TextMessage;

您可能正在尝试在不支持的
包含
包含时进行筛选。您必须使用
选择
创建投影:

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);
更多信息,请看这个

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

成功了

“…我有一个错误…”-这个信息不是很有用。它没有说明什么不起作用,也就是说,您是否在任何地方收到任何错误消息,您是否尝试调试问题以确保它确实执行了预期的操作。您收到了哪些错误?错误消息并不只是为了好玩,它们实际上说明了错误所在,并且应该始终包括在内,这样我们就不必猜测错误所在。请查看并相应地改进您的问题。调用中心方法“DeleteMessage”失败。System.InvalidOperationException:ThenInclude属性lambda表达式“z=>{from messages详细信息g in z.messages详细信息,其中([g].TextMessage==\uMessages详细信息\u0)选择[g]=>SingleOrDefault()}无效。表达式应表示属性访问:“t=>t.MyProperty”。要将在派生类型上声明的导航作为目标,请指定目标类型的显式类型lambda参数,例如“(派生d)=>d.MyProperty”。有关包含相关数据的更多信息,请参见.thk,我检查的新方法是有效的,但我的解决方案更紧凑,也更有效