我有以下數據層設置:public class Repository : IRepository { private readonly MyDbContext _dbContext; public List<Meter> Search(Expression<Func<Meter,bool>> criteria) IQueryable<Meter> results = _dbContext.Meters; return results.Where(criteria).ToList(); } }}... from a client class:IRepository _repository;public void ClientMethod () { ICollection<int> ids = new List<int>() {1, 2, 3); var results = _repository.Search(c=> ids.Contains(c.Id)); // This throws exception}這會導致異常:表達式Where(源:DbSet,謂詞:(m) => (未處理的參數:__ids_0).Contains(m.Id))' 無法翻譯。以可翻譯的形式重寫查詢,或者通過插入對 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的調用來顯式切換到客戶端計算但如果我將集合引用更改為 IEnumerable 或 List,它就會起作用:public void ClientMethod () { // This works List<int> ids = new List<int>() {1, 2, 3); var results = _repository.Search(c=> ids.Contains(c.Id)); // This works IEnumerable<int> ids = new List<int>() {1, 2, 3); var results = _repository.Search(c=> ids.Contains(c.Id)); }為什么它不適用于 ICollection,但適用于 IEnumerable 和 List?我的許多客戶端方法都采用 ICollection 作為參數。我正在使用 EF Core 3.0,但我相信我在 2.1 中遇到了同樣的問題,它只是沒有拋出,因為它在客戶端上對其進行了評估。
3 回答

當年話下
TA貢獻1890條經驗 獲得超9個贊
這是 3.1 中修復的已知錯誤。由于查詢管道重寫后的所有回歸,3.0 幾乎無法使用。
我建議關注 ef core 的 github 上的問題跟蹤器。
https://github.com/dotnet/efcore/pull/17599

UYOU
TA貢獻1878條經驗 獲得超4個贊
從 2.2 遷移到 EF Core 3.0 時,我遇到了同樣的問題。我之前已經配置了 ef 以在客戶端評估時拋出錯誤,并且工作正常。所以我確信這是 3.0 的一個新問題,是他們重寫 linq 引擎時引入的。
將其轉換為 IEnumerable 或 List 對我也適用,感謝您的提示!

慕妹3146593
TA貢獻1820條經驗 獲得超9個贊
當您轉換為 IEnumerable() 或 List() 時,EFCore 會強制客戶端評估,這就是它起作用的原因。(但以性能成本為代價)
“在版本 3.0 之前,Entity Framework Core 支持查詢中任意位置的客戶端評估”
3.0 之前的 EFCore 版本還允許您在混合服務器和客戶端評估時添加警告。
然后 EF 更改了策略,不允許混合服務器和客戶端評估,因此不會發生意外的性能問題。不過,情況比這要復雜一些,因此這里是EFCore 3.1 重大更改的鏈接*所有其他版本也可以在此處以及左側菜單導航中找到,包括 3.0。
- 3 回答
- 0 關注
- 192 瀏覽
添加回答
舉報
0/150
提交
取消