如何使用LINQ where表达式?

时间:2011-11-29 17:29:37

标签: linq entity-framework repository-pattern

我正在新项目中实现service \ repository模式。我有一个看起来像这样的基本界面。一切都很好,直到我需要使用GetMany方法。我只是不确定如何将LINQ表达式传递给GetMany方法。例如,我如何简单地对名称类型的对象列表进行排序?

nameRepository.GetMany(?)

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    void Delete(Expression<Func<T, bool>> where);
    T GetById(long Id);
    T GetById(string Id);
    T Get(Expression<Func<T, bool>> where);
    IEnumerable<T> GetAll();
    IEnumerable<T> GetMany(Expression<Func<T, bool>> where);

}



 public virtual IEnumerable<T> GetMany(Expression<Func<T, bool>> where)
 {
    return dbset.Where(where).ToList();
 }

1 个答案:

答案 0 :(得分:2)

假设您有IRepository<MyClass>的实施方式,您可以这样调用GetMany

IRepository<MyClass> repository = ...;

IEnumerable<MyClass> filtered = repository.GetMany(
    mc => true);

请注意mc => true lambda expression。在这种情况下,mc是传递给MyClass的参数(在这种情况下,类型Expression<Func<T, bool>>)将被评估(一个将通过IQueryable<T>假设)和mc.SomeProperty == someValue是一个返回true的表达式,Expression<Func<T, bool>>filtered的第二个类型参数。

获得var filteredAndOrdered = filtered.OrderBy(mc => mc.MyProperty); 后,您可以使用order by子句(或OrderBy extension method,它们相同)对结果进行排序,如下所示:

GetMany

请注意,IEnumerable<T>会返回IQueryable<T>不会返回OrderBy;如果您的结果集很大,这很重要,因为排序将在客户端上进行,而不是发送到服务器。

对于{{1}}操作,这可能很昂贵,因为它必须在返回第一个结果之前完成整个序列(按顺序)。