我正在新项目中实现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();
}
答案 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}}操作,这可能很昂贵,因为它必须在返回第一个结果之前完成整个序列(按顺序)。