【问题标题】:returning total count of records返回记录总数
【发布时间】:2014-11-06 12:15:44
【问题描述】:

我正在使用 WCF 休息服务,我想返回总记录数,就像我们在 webapi 或微风中拥有 inlinecount 一样。

我在 WCF 中的方法是

   [WebGet(UriTemplate = "GiveMeNamesOfStudents", ResponseFormat = WebMessageFormat.Json)]
    public List<MyDataClass> GiveMeNamesOfStudentsList()
    {
        var returnData = (from myentity in myEntityRepository.AsQueryable()
                          select new MyDataClass
                            {
                                Id = myentity.Id,
                                Name = myentity.Name
                            }).Skip(PageSize * PageNo).Take(PageSize).ToList();
        return returnData;
    }

如何将我的实际数据的总记录数连同数据一起返回?

【问题讨论】:

  • 您想返回找到的总记录数以及实际的分页数据吗?
  • 您的问题是什么?计算列表中的元素?向包含集合的每条传出消息添加“总记录数”属性?
  • @haim770 是的,我想返回我的实际数据计数
  • @Happy,连同实际数据?还是只是计数?
  • @haim770 连同实际数据

标签: c# linq entity-framework wcf wcf-rest


【解决方案1】:

我建议返回包含您的列表和总数的DTO

您可以添加其他信息,例如页数,但我会在这里保持简单。

首先创建您的通用DTO,以便您也可以在其他方法中使用它。

 public class ListResult<T>
 {
     public List<T> Data { get; set; }
     public int TotalCount { get; set; }
     public int Page{ get; set; }
 }

现在返回对象

[WebGet(UriTemplate = "GiveMeNamesOfStudents", ResponseFormat = WebMessageFormat.Json)]
public ListResult<MyDataClass> GiveMeNamesOfStudentsList()
{
    var returnData = (from myentity in myEntityRepository.AsQueryable()
                      select new MyDataClass
                        {
                            Id = myentity.Id,
                            Name = myentity.Name
                        }).Skip(PageSize * PageNo).Take(PageSize).ToList();

    return new ListResult<MyDataClass> 
                        { 
                             Data = returnData, 
                             TotalCount = myEntityRepository.Count(), 
                             Page = PageNo 
                        };
}

【讨论】:

  • 我正在尝试 .Skip(PageSize * PageNo).Take(PageSize).ToList().count() 但它不起作用
  • 该方法称为 Count() 而不是 count()。现在可以用了吗?
  • @dknaack,您的Count() 只会返回页面大小。
  • 将计数添加到末尾是行不通的,因为它只会计算该页面上的项目数,因为 Skip and Take。
  • @Happy,它不起作用,因为该方法需要返回List&lt;MyDataClass&gt;,而不是int
【解决方案2】:

您必须查询数据库两次;一次没有.Skip.Take,获取总计数,然后再次使用.Skip.Take 运行相同的查询以获取数据页。

    var returnData = (from myentity in myEntityRepository.AsQueryable()
                      select new MyDataClass
                        {
                            Id = myentity.Id,
                            Name = myentity.Name
                        }).Skip(PageSize * PageNo).Take(PageSize).ToList();

    var totalCount = myEntityRepository.myentity.count();

另一种选择可能是不使用 EF,而只是调用一个存储过程,该过程可以运行两个查询并在输出参数中返回两个值。这仍然会运行 2 个查询,但只会使用 1 个调用从您的应用到数据库,而不是 2 个。

【讨论】:

  • 以及如何在我的返回列表中返回这个 totalCount 变量
  • 返回一个容器对象。类似class PageResult&lt;T&gt; { public List&lt;T&gt; Data { get; set; }; public int Count { get; set; } }
【解决方案3】:

因为你的方法的返回类型是List&lt;MyDataClass&gt;,所以你不能返回任何东西。您需要引入一个 DTO,它会返回您的实体以及计数:

public class MyDataClassDTO
{
    public List<MyDataClass> Data { get; set; }
    public int TotalRecordCount { get; set; }   
}

然后返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-14
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多