实体框架库存储库

时间:2010-05-01 17:42:14

标签: c# linq entity-framework

我正在尝试创建一个与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;,我无法编译它。

1 个答案:

答案 0 :(得分:3)

试试这个:

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

如果要添加其他条件并在数据库端执行它们(使用SQL),GetAll()应返回IQueryableIQueryable版本的Expression版本,因此无需拨打Compile()。 EF将表达并将其转换为SQL。

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