gpt4 book ai didi

c# - 我应该如何从我的服务层方法中公开总记录数和分页记录的 IEnumerable 集合?

转载 作者:太空狗 更新时间:2023-10-29 18:29:58 25 4
gpt4 key购买 nike

我首先将 EF4 与代码一起使用,并且有一个用于持久化的存储库和一个与之交互的服务层。我有一个服务层方法,它在我的存储库上调用 IQueryable 方法并返回包含实体的 IEnumerable。我还需要返回总记录数,以便计算分页链接。

我应该如何从我的服务方法返回 int 和 IEnumerable?

  • 在总行数的方法上使用 out 参数
  • 创建一个单独的类,将总行数作为属性包含在内
  • 将分页 LINQ 查询移出服务层(从服务层的存储库公开 IQueryable)
  • 在服务层上创建一个完全独立的方法来执行新的计数查询。

所有这些都应该有效,但哪个最干净?

更新:这里是对架构的一些说明。如果这是错误的,那么请告诉我更好的方法(例如 - 在表示层而不是服务层等进行分页)

repo 层:

返回DbSet的IQueryable,从表示层抽象出数据库访问

服务层:

在 IQueryable 上执行 LINQ 查询以过滤并根据需要使用 skip 和 take 获取页面项目并返回 IEnumerable(也将在返回时设置为 List 以避免任何 DbContext 生命周期问题)

表现层:

调用Service层的方法(getPagedResults(filters, pageNumber, pageSize))

从外观上看,我还需要添加一个单独的方法来获取总结果。希望在一个电话中完成这一切。

我不希望将所有记录带回演示文稿,然后页面...似乎效率低下。

最佳答案

你可以这样做

public class Repository<TEntity>
{
public IEnumerable<TEntity> GetCollection(Expression<Func<TEntity, bool>> filter,
int pageSize, int pageIndex)
{
return YourDbSet.Where(filter).OrderBy(sortExpression).Skip(pageSize * pageIndex).Take(pageSize);
}

public int Count(Expression<Func<TEntity, bool>> filter)
{
return YourDbSet.Where(filter).Count();
}
}

然后你可以写一个扩展方法来使用这两种方法

public static Pagination<TEntity> GetPagination<TEntity>(this Repository<TEntity> repository, 
Expression<Func<TEntity, bool>> filter, int pageSize, int pageIndex)
{
var entities = repository.GetCollection(filter, pageSize, pageIndex);
var count = repository.Count(filter);

return new Pagination(entities, pageSize, pageIndex + 1, count);
}

这样您就可以独立地重用 GetCollectionCount 方法。您可以动态构建 where 条件。看看我的answer

关于c# - 我应该如何从我的服务层方法中公开总记录数和分页记录的 IEnumerable 集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6417886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com