2010-05-01 164 views
0

我试图创建一个基本知识库,用于实体框架4.0并遇到一些麻烦。在下面的代码中,为什么不可能在一行中做到这一点?实体框架基础知识库

public IEnumerable<T> GetAll<T>(Expression<Func<T, bool>> filter) 
{ 
    IEnumerable<T> allCustomers = this.GetAll<T>(); 
    IEnumerable<T> result = allCustomers.Where(filter.Compile()); 

    return result; 
} 

这会不会导致2条SQL语句:一个没有检索所有行的WHERE子句,以及一个用WHERE子句只检索匹配谓词的行?

这怎么能用一个SQL语句完成?如果我尝试将filter.Compile()传递给Func < Customer,则bool >。

回答

3

试试这个:

this.GetAll<T>().Where(filter); 

如果要添加其他条件和(使用SQL)执行它们在数据库方面,GETALL()应该返回IQueryableIQueryable版本在哪里需要Expression,所以不需要拨打Compile()。 EF将表达并将其转换为SQL。

使用IEnumerable版本的Where在应用过滤器之前执行查询并检索表中的所有行。

+0

是的,工作!非常感谢!返回(this.GetAll ()as IQueryable ).Where(filter); – Andy 2010-05-03 13:24:18

+0

@Andy:这太棒了,但仍然'GetAll ()'应该返回'IQueryable '并且不应该需要投射。如果'GetAll ()'返回'IEnumerable ',则从表中选择所有行并在应用程序端进行筛选。 – LukLed 2010-05-03 17:57:15