1

我有以下基本方法:

public IQueryable<T> All
        {
            get
            {
                return Context.DataSet<T>();
            }
        }

public IQueryable<T> Search(Func<T, bool> where)
        {
            return this.All.Where(where); // compiling error, since it returns IEnumerable by default. Why not returning IQueryable?
        }

但是,当我在服务类中使用“全部”属性时,它解析为 IQueryable

private List<CustomerDomainModel> PrepareBaseResultingData(int id)
        {
            IQueryable<CustomerDomainModel> custs = _customerRepository.All.Where(c => c.ID == id); // it returns IQueryable by default so it is good!
            return custs.ToList();
        }

“Where 子句”扩展方法返回 IEnumerable 或 IQuaryable 是否有任何原因?

编辑问题:

为什么 Search 方法有编译错误?我原以为“this.All.Where(where)”会返回 IQueryable

4

1 回答 1

2

IQueryable.Where<TSource>方法采用Expresssion<Func<TSource, bool>>. 将搜索方法中的参数更改where为 type Expression<Func<T, bool>>,它将毫无问题地编译。

您的第二次使用正确解决的原因是由于homoiconicity。lambda 表达式被解释为 aFunc或 an Expression<Func>,具体取决于上下文。如果该方法期望前者,编译器将查看c => c.ID == id并看到一个Func<int, bool>; 如果它期望后者,它将看到一个Expression<Func<int, bool>>.

于 2013-07-10T02:30:20.437 回答