返回记录总数

时间:2014-11-06 12:15:44

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

我正在使用WCF休息服务,我希望返回总记录数,就像我们在webapi或breeze中有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;
    }

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

3 个答案:

答案 0 :(得分:4)

我建议您返回包含您的列表和总计数的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 
                        };
}

答案 1 :(得分:3)

你必须两次查询数据库;一旦没有.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个。

答案 2 :(得分:2)

由于您的方法的返回类型为List<MyDataClass>,因此您无法返回任何其他内容。您需要引入一个DTO,它将您的实体与计数一起返回:

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

然后返回。