如何解决为什么 EF 核心告诉我“指定成员未映射”?
我想按名称过滤用户并使用投影查询(通过选择)返回一个新的 DTO:
var result = context.Users
.Where(user => user.FullName == search)
.Select(u => new UserPagingViewModel
{
Id = u.Id,IsSearchable = u.IsSearchable,FirstName = u.FirstName,LastName = u.LastName,FullName = u.FullName,Photo200 = u.Photo200,City = u.City,About = u.About,Skills = u.UserSkills.Select(us => us.Skill.Name),IsTeamMember = u.UserTeams.Any(ut => ut.UserAction == UserActionEnum.JoinedTeam)
})
.ToList();
用户类别:
public class User : IHasId
{
public long Id { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public string LastName { get; set; }
public string City { get; set; }
public string About { get; set; }
public string Telegram { get; set; }
public string Email { get; set; }
public string Mobile { get; set; }
public string FullName => FirstName + " " + SecondName + " " + LastName;
public string Photo100 { get; set; }
public string Photo200 { get; set; }
public bool IsModerator { get; set; }
public List<UserTeam> UserTeams { get; set; }
public List<UserSkill> UserSkills { get; set; }
[NotMapped]
public List<Team> TeamsToRecruit { get; set; }
[NotMapped]
public bool AnyTeamOwner { get; set; }
}
数据库是 PostgreSql
。数据提供者PostgreSQL/Npgsql provider for Entity Framework Core
但是当我尝试执行此请求时,我收到以下消息的异常:
LINQ 表达式 'DbSet
我不想使用客户评估。 例如,如果我比较 FirstName 属性,则一切正常。
请帮我弄清楚如何解决这个问题。
解决方法
您在三个地方都有全名。由于您没有全名列(或计算列),因此您不能在 dbcontext 查询中使用它。它会生成如下的sql。
SELECT FULLNAME,... FROM USERS WHERE FULLNAME = N"some value".
这就是您收到错误的原因。
您需要从 dbcontext 查询中删除所有 FullName 并执行如下过滤器。
var result = context.Users
.Where(x => (x.FirstName + " " + x.SecondName + " " + x.LastName) == search)
.Select(u => new UserPagingViewModel
{
Id = u.Id,IsSearchable = u.IsSearchable,FirstName = u.FirstName,LastName = u.LastName,//FullName = u.FullName,Photo200 = u.Photo200,City = u.City,About = u.About,Skills = u.UserSkills.Select(us => us.Skill.Name),IsTeamMember = u.UserTeams.Any(ut => ut.UserAction == UserActionEnum.JoinedTeam)
})
.ToList();
这会让你像下面这样
FROM [Users] AS [t]
WHERE ([t].[FirstName] + N' ' + [t].[SecondName] + N' ' + [t].[LastName]) = N'some value'
然后从 User 对象中删除 FullName。
public class User : IHasId
{
public long Id { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public string LastName { get; set; }
public string City { get; set; }
public string About { get; set; }
public string Telegram { get; set; }
public string Email { get; set; }
public string Mobile { get; set; }
// public string FullName => FirstName + " " + SecondName + " " + LastName;
public string Photo100 { get; set; }
public string Photo200 { get; set; }
public bool IsModerator { get; set; }
public List<UserTeam> UserTeams { get; set; }
public List<UserSkill> UserSkills { get; set; }
[NotMapped]
public List<Team> TeamsToRecruit { get; set; }
[NotMapped]
public bool AnyTeamOwner { get; set; }
}
将 FullName 添加到 UserPagingViewModel。
public class UserPagingViewModel{
...
public string FirstName { get; set; }
public string SecondName { get; set; }
public string LastName { get; set; }
public string FullName => $"{FirstName} {SecondName} {LastName}";
}
如果您希望 FullName 作为用户对象的一部分,则添加为未映射或使用 HasComputedColumnSql
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。