繁体   English   中英

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

[英]Entity framework core 2.1: could not be translated and will be evaluated locally

一个简单的查询:

(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)' 不能是翻译并将在本地进行评估。

语句的顺序很重要。 EF Core 将只允许在最后一个 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM