这是否可以轻松实现,还是应该添加skip / take作为参数?
public IEnumerable<T> GetKittens<T>(Expression<Func<Kitten, bool>> predicate = null) where T : KittenViewModel, new()
{
var kittenModels = GetModels(); // IQueryable<T>
// how can I make the predicate say 'select the top 10' or
// 'skip 5 and take 5'
kittenModels = kittenModels.Where(predicate);
}
答案 0 :(得分:6)
根据定义,谓词是一个布尔测试,用于确定是否应包含项目。如果对象中有关于它在集合中的位置的某种信息(这似乎不太可能),你可以使用它,但你最好的选择可能只是为你的方法添加2个参数(take和skip)然后只做像这样的东西:
public IEnumerable<T> GetKittens<T>(Expression<Func<Kitten, bool>> predicate = null, int take = -1, int skip = -1) where T : KittenViewModel, new()
{
var kittenModels = GetModels(); // IQueryable<T>
if(skip > 0)
kittenModels = kittenModels.Skip(skip);
if(take > 0)
kittenModels = kittenModels.Take(take);
kittenModels = kittenModels.Where(predicate);
}
请注意,通常情况下,你可能想要应用谓词,然后跳过/接受,但由于我不知道你想要做什么,我不能肯定地说。