实体框架基础知识库
问题描述:
我试图创建一个基本知识库,用于实体框架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 >。
答
试试这个:
this.GetAll<T>().Where(filter);
如果要添加其他条件和(使用SQL)执行它们在数据库方面,GETALL()应该返回IQueryable
。 IQueryable
版本在哪里需要Expression
,所以不需要拨打Compile()
。 EF将表达并将其转换为SQL。
使用IEnumerable
版本的Where
在应用过滤器之前执行查询并检索表中的所有行。
是的,工作!非常感谢!返回(this.GetAll()as IQueryable ).Where(filter); –
Andy
2010-05-03 13:24:18
@Andy:这太棒了,但仍然'GetAll()'应该返回'IQueryable '并且不应该需要投射。如果'GetAll ()'返回'IEnumerable ',则从表中选择所有行并在应用程序端进行筛选。 –
LukLed
2010-05-03 17:57:15