C# 我应该如何从我的服务层方法公开总记录计数和分页记录的IEnumable集合?
我首先在代码中使用EF4,并且有一个持久性存储库和一个与之交互的服务层。我有一个服务层方法,它在我的存储库上调用IQueryable方法,并返回一个包含实体的IEnumerable。我还需要返回总记录计数,以便计算分页链接 如何从服务方法返回int和IEnumerableC# 我应该如何从我的服务层方法公开总记录计数和分页记录的IEnumable集合?,c#,asp.net,entity-framework,pagination,repository,C#,Asp.net,Entity Framework,Pagination,Repository,我首先在代码中使用EF4,并且有一个持久性存储库和一个与之交互的服务层。我有一个服务层方法,它在我的存储库上调用IQueryable方法,并返回一个包含实体的IEnumerable。我还需要返回总记录计数,以便计算分页链接 如何从服务方法返回int和IEnumerable 在方法上使用out参数作为总行数 创建一个单独的类,该类将总行数作为属性 将分页LINQ查询移出服务层(从服务层上的repo公开IQueryable) 在服务层上创建一个完全独立的方法,该方法只为count执行新的查询 所
- 在方法上使用out参数作为总行数
- 创建一个单独的类,该类将总行数作为属性
- 将分页LINQ查询移出服务层(从服务层上的repo公开IQueryable)
- 在服务层上创建一个完全独立的方法,该方法只为count执行新的查询
我不想把所有的记录都带回来做演示,然后翻页。。。似乎效率不高。如果要返回的
可枚举项包含所有项,我会在从函数返回If之前对其执行ToList()
。(然后您可以进行计数
,而无需支付任何费用)
如果函数返回总数的子集(使用Skip
和take
),我会添加一个单独的函数来获取总数。您可以这样做
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();
}
}
公共类存储库
{
公共IEnumerable GetCollection(表达式筛选器,
int pageSize,int pageIndex)
{
返回dbset.Where(filter).OrderBy(sortExpression).Skip(pageSize*pageIndex).Take(pageSize);
}
公共整数计数(表达式筛选器)
{
返回dbset.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);
}
public静态分页GetPagination(此存储库,
表达式筛选器、整型页面大小、整型页面索引)
{
var entities=repository.GetCollection(过滤器、页面大小、页面索引);
var count=repository.count(过滤器);
返回新分页(实体、页面大小、页面索引+1、计数);
}
这样,您就可以独立地重用GetCollection
和Count
方法。
您可以动态地构建where条件。如果您已经返回了IEnumerable
,请查看my,是否有特定原因导致您不在IEnumerable
上使用.Count()
?您只是将子集呈现给前端吗?前端不应该负责分页吗?返回的IEnumerable是否包含所有项?(与count返回的项目数相同)@AllenG-I在服务层本身进行分页,然后将列表返回给UI/Codebehind使用者。这样我就可以避免Dbcontext生命周期中的任何问题。而且,这样我就不必将所有记录发送到前端,然后再进行分页。。将直接获取我在服务层查询中需要的记录。@Magnus-我试图避免发送所有项目。。。只需通过查询从repo返回的IQueryable来获取我需要的内容。更新问题以添加更多信息。我仍在学习,因此尝试坚持具体实现,直到我了解泛型为止。@Developr因为您使用IQueryable,您已经在使用泛型了。通用参数由编译器推断。所以你不必给他们这里有一个链接到另一个问题,显示了我的架构。。。非常简单和具体: