4

这是否可能以一种简单的方式进行,还是我应该添加跳过/采取作为参数?

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); 

}
4

1 回答 1

6

根据定义,谓词是一个布尔测试,用于确定是否应包含一个项目。如果有关于对象在集合中的位置的某种信息(这似乎不太可能),您可以使用它,但您最好的选择可能是在您的方法中添加 2 个参数(获取和跳过),然后执行像这样的东西:

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); 

}

请注意,通常,您可能希望应用谓词然后跳过/采取,但由于我不知道您要做什么,我不能肯定地说。

于 2014-10-07T12:31:36.587 回答