【发布时间】:2020-01-29 02:21:51
【问题描述】:
我有以下数据层设置:
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(source: DbSet, predicate: (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 中遇到了同样的问题,只是没有抛出,而是在客户端上评估它。
【问题讨论】:
标签: c# entity-framework-core ef-core-2.1 ef-core-3.0