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,我检查的新方法是有效的,但我的解决方案更紧凑,也更有效