C# 实体框架核心2.1:无法翻译,将在本地进行评估

C# 实体框架核心2.1:无法翻译,将在本地进行评估,c#,linq,entity-framework-core,C#,Linq,Entity Framework Core,一个简单的查询: (来自数据库用户中的用户) 选择newuserobj { DisplayName=user.LastName+“”+user.FirstName }).OrderBy(o=>o.DisplayName) .Where(w=>w.EndDate==null) .ToList(); 模型类为: 公共类UserObj { 公共字符串名{get;set;} 公共字符串LastName{get;set;} 公共字符串DisplayName{get;set;} 公共日期时间?结束日期{g

一个简单的查询:

(来自数据库用户中的用户)
选择newuserobj
{
DisplayName=user.LastName+“”+user.FirstName
}).OrderBy(o=>o.DisplayName)
.Where(w=>w.EndDate==null)
.ToList();
模型类为:

公共类UserObj
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串DisplayName{get;set;}
公共日期时间?结束日期{get;set;}
}
然而我得到了警告

警告:Microsoft.EntityFrameworkCore.Query[20500] 无法转换LINQ表达式“where(new UserObj(){DisplayName=([user].LastName++”“++[user.FirstName)}.EndDate==null”),将在本地对其求值


语句的顺序很重要。EF Core只允许在最后一个select语句中使用不可翻译的表达式(*),例如字符串连接

所以

  • 或者重新组织代码,使select语句位于最后(在
    ToList()之前)
  • 或者在数据库中添加一个计算列
    DisplayName
    ,该列等于
    LastName+“”+FirstName
    ,并在自定义DTO对象中查询该列

(*)EF Core还不能为不同的数据提供程序转换为类似的服务器端语句的内容

感谢@NetMage的评论。应该初始化EndDate。添加它之后,错误就消失了

(from user in _db.Users
 select new UserObj
 {
     DisplayName = user.LastName + " " + user.FirstName,
     EndDate = user.EndDate
  }).OrderBy(o => o.DisplayName)
  .Where(w => w.EndDate == null)
  .ToList();

我无法在数据库中添加新列
DisplayName
。请粘贴代码好吗?@您好,
EndDate
字段来自哪里?它是
UserObj
的一部分吗?它是如何初始化的?(您知道
w
的类型吗?)是的,它是
UseObj
的一个属性。我已经在帖子中写过了。它没有初始化。所以它总是
null
,而
中的
什么都不做?不,我误解了你的评论。在数据库中,一些行有值,但其他行为null。它已经初始化。它在哪里初始化?你正在用
创建它>新建UserObj
,不将其设置为任何值。