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

时间:2020-10-06 17:29:53

标签: c# linq entity-framework-core

一个简单的查询:

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

模型类是:

public class UserObj
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public string DisplayName {get; set;}
    public DateTime? EndDate {get; set;}
 }

但是我得到警告

警告:Microsoft.EntityFrameworkCore.Query [20500] LINQ表达式'where(new UserObj(){DisplayName =(([[user] .LastName +“” + [user.FirstName)}。EndDate == null)'无法翻译,将在本地进行评估。

2 个答案:

答案 0 :(得分:1)

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

所以

  • 要么重新组织代码,以使select语句排在最后(ToList()之前)
  • 或在数据库中添加等于DisplayName的计算列LastName + ' ' + FirstName,并在自定义DTO对象中查询此列。

(*) EF Core尚不能将其转换为针对不同数据提供者的类似服务器端语句的内容

答案 1 :(得分:0)

感谢@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();