是否可以将Take()、Skip()、OrderBy()等作为谓词传递给函数

本文关键字:谓词 函数 Skip Take OrderBy 是否 | 更新日期: 2023-09-27 18:25:45

这是一种简单的方法吗?还是应该添加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); 
}

是否可以将Take()、Skip()、OrderBy()等作为谓词传递给函数

根据定义,谓词是一种布尔测试,用于确定是否应包含项。如果对象在集合中的位置有某种信息(这似乎不太可能),你可以使用它,但你最好的办法可能是在你的方法中添加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); 
}

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