隐含的AsQueryable

时间:2012-06-13 16:16:08

标签: c# linq entity-framework linq-to-entities

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

1 个答案:

答案 0 :(得分:2)

  

基本提供程序如何完成对AsQueryable的隐式使用?

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