我正在尝试创建一个与Entity Framework 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&lt; Customer,bool&gt;,我无法编译它。
答案 0 :(得分:3)
试试这个:
this.GetAll<T>().Where(filter);
如果要添加其他条件并在数据库端执行它们(使用SQL),GetAll()应返回IQueryable
。 IQueryable
版本的Expression
版本,因此无需拨打Compile()
。 EF将表达并将其转换为SQL。
使用IEnumerable
版Where
执行查询并在应用过滤器之前检索表中的所有行。