Search code examples
servicestackormlite-servicestack

OrmLite db.Select not return response


I use Servietack and OrmLite in our project. When the request (Db.Select) is sent, after much time, no response return.

       public object Get(GetCategoryNews request)
        {
            var PageCount = 20;
            var skip = (request.Page.GetValueOrDefault(1) - 1) * PageCount;

            var cacheKey = UrnId.Create<GetCategoryNews>(DateTime.Now.ToString("yyMMddhhmm") + skip);
            return base.Request.ToOptimizedResultUsingCache(base.Cache, cacheKey, () =>
            {
            //On this line, waiting and no response
              var status = Db.Select<News>().Skip(skip).Take(PageCount).Select(o => new NewsResponse() {
                    Id = o.Id,
                    CreateOn = o.CreateOn,
                    Description = o.Description,
                    PublishOn = o.PubDate,
                    Title = o.Title
                });
                return status;
            });
        }

but when Count request, It work well

    var count = Db.Count<News>();

How do I fix this?


Solution

  • Calling Db.Select<News>() returns a List<News> which downloads your entire table results into an in memory list collection. Since you're trying to page the resultset you need to instead build an SqlExpression that OrmLite executes to only return the results you're interested in, e.g:

    //Create SQL Query
    var q = db.From<News>()
              .Skip(skip)
              .Take(PageCount);
    
    var results = db.Select(q); //Executes paged query
    return results.Select(o => new NewsResponse {
        Id = o.Id,
        CreateOn = o.CreateOn,
        Description = o.Description,
        PublishOn = o.PubDate,
        Title = o.Title
    });