Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该如何从我的服务层方法公开总记录计数和分页记录的IEnumable集合?_C#_Asp.net_Entity Framework_Pagination_Repository - Fatal编程技术网

C# 我应该如何从我的服务层方法公开总记录计数和分页记录的IEnumable集合?

C# 我应该如何从我的服务层方法公开总记录计数和分页记录的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执行新的查询 所

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

如何从服务方法返回int和IEnumerable

  • 在方法上使用out参数作为总行数
  • 创建一个单独的类,该类将总行数作为属性
  • 将分页LINQ查询移出服务层(从服务层上的repo公开IQueryable)
  • 在服务层上创建一个完全独立的方法,该方法只为count执行新的查询
所有这些都应该有效,但哪一个是最干净的

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

回购层:

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

服务层:

在iQueryEnable上执行LINQ查询以根据需要使用skip and take筛选和获取页面项,并返回IEnumerable(还将设置为“返回时列出”,以避免任何DbContext生存期问题)

表示层:

调用服务层上的方法(getPagedResults(筛选器、pageNumber、pageSize))

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


我不想把所有的记录都带回来做演示,然后翻页。。。似乎效率不高。

如果要返回的
可枚举项包含所有项,我会在从函数返回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,您已经在使用泛型了。通用参数由编译器推断。所以你不必给他们这里有一个链接到另一个问题,显示了我的架构。。。非常简单和具体: