簡體   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