以下 linq2entities 代码似乎调用了 FirstOrDefault 扩展的 IEnumerable 版本,因为 PersonHistories 是一个 ICollection。然而,在运行时,它实际上调用了 IQueryable 版本。
var test = db.Persons.Where(d => d.PersonKey == 4)
.Select(f => f.PersonHistories.FirstOrDefault());
我遇到的问题是我使用的自定义查询提供程序不执行此自动转换,并且我收到错误“...ICollection 不能用于 IQueryable 类型的参数”。因此需要显式调用 AsQueryable 来解决这个问题,但是对于复杂的查询,它变得非常多余并且感觉不是很干燥:
db.Persons.Where(d => d.PersonKey == 4)
.Select(f => f.PersonHistories.AsQueryable().FirstOrDefault());
我已经在框架参考源中挖掘,试图找到 Linq 2 Entities 访问者/提供者的东西,但没有运气(也许不是任何开放参考源的一部分)。 基础提供者如何实现对 AsQueryable 的隐式使用?
我明白这些被翻译成表达式树。我明白 Enumerable.FirstOrDefault 被提供商替换为 Queryable.FirstOrDefault 。这就是问题的前提。