【问题标题】:Entity framework core 2.1: could not be translated and will be evaluated locally实体框架核心 2.1:无法翻译,将在本地评估
【发布时间】:2020-10-06 17:29:53
【问题描述】:

一个简单的查询:

(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)' 无法翻译,将在本地计算。

【问题讨论】:

  • 字段EndDate从哪里来的?它是UserObj 的一部分吗?它是如何初始化的? (你知道w的类型吗?)
  • 是的,它是UseObj 的一个属性。我已经在帖子里写了。它没有被初始化。
  • 那么它将永远是nullWhere 什么都不做?
  • 不,我误解了你的评论。在数据库中,一些行有值,但其他行是空的。它已初始化。
  • 在哪里初始化?您正在使用 new UserObj 创建它,而不是将其设置为任何值。

标签: c# linq entity-framework-core


【解决方案1】:

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

所以,

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

(*) EF Core 还不能为不同的数据提供者转换成类似的服务器端语句的东西

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2020-03-14
    相关资源
    最近更新 更多