1

以下 linq2entities 代码似乎调用了 FirstOrDefault 扩展的 IEnumerable 版本,因为 PersonH​​istories 是一个 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 。这就是问题的前提。

4

1 回答 1

2

基础提供者如何实现对 AsQueryable 的隐式使用?

他们没有。您的代码根本没有真正执行FirstOrDefault()。它构建了一个表示调用的表达式树,但这不是直接执行的。查询提供者看到,计算出它f.PersonHistories实际上是基于数据库中的实体,并适当地转换查询。

于 2012-06-13T16:21:52.887 回答