亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

表達式中的 EF Core 3 x.Contains(),其中 x 是 ICollection

表達式中的 EF Core 3 x.Contains(),其中 x 是 ICollection

PHP
Smart貓小萌 2024-01-20 21:40:23
我有以下數據層設置: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


查看完整回答
反對 回復 2024-01-20
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

從 2.2 遷移到 EF Core 3.0 時,我遇到了同樣的問題。我之前已經配置了 ef 以在客戶端評估時拋出錯誤,并且工作正常。所以我確信這是 3.0 的一個新問題,是他們重寫 linq 引擎時引入的。

將其轉換為 IEnumerable 或 List 對我也適用,感謝您的提示!


查看完整回答
反對 回復 2024-01-20
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

當您轉換為 IEnumerable() 或 List() 時,EFCore 會強制客戶端評估,這就是它起作用的原因。(但以性能成本為代價)

  • “在版本 3.0 之前,Entity Framework Core 支持查詢中任意位置的客戶端評估”

  • 3.0 之前的 EFCore 版本還允許您在混合服務器和客戶端評估時添加警告。

  • 然后 EF 更改了策略,不允許混合服務器和客戶端評估,因此不會發生意外的性能問題。不過,情況比這要復雜一些,因此這里是EFCore 3.1 重大更改的鏈接*所有其他版本也可以在此處以及左側菜單導航中找到,包括 3.0。


查看完整回答
反對 回復 2024-01-20
  • 3 回答
  • 0 關注
  • 192 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號