예제 #1
0
        public async Task <(IEnumerable <WebSite> sites, int count)> FindByFilter(WebSiteSearchObject searchObject)
        {
            bool hasSort   = searchObject.SortExpression.Count > 0;
            var  sortOrder = "ORDER BY #.Id";

            if (hasSort)
            {
                var sorts = searchObject.SortExpression.Select(sort =>
                                                               "#." + Enum.GetName(typeof(SortColumn), sort.sortColumn) + (sort.sortOrder == SortOrder.Ascending ? " ASC" : " DESC")
                                                               );
                sortOrder = "ORDER BY " + string.Join(',', sorts);
            }

            int count = await _repositorySession.Connection.QuerySingleAsync <int>(
                @"SELECT COUNT(*)
                            FROM dbo.WebSite ws
                            WHERE ws.IsDeleted = 0",
                transaction : _repositorySession.CurrentTransaction);

            IEnumerable <WebSite> sites = new List <WebSite>();

            if (count > 0)
            {
                sites = await _repositorySession.Connection.QueryAsync <WebSite, WebSiteCategory, WebSite>(
                    $@"SELECT 
                        t.*, 
                        c.*
                    FROM (
                        SELECT ws.*,
                            ROW_NUMBER() OVER (
                                {sortOrder.Replace("#", "ws")}
                            ) as RowNumber
                        FROM dbo.WebSite ws
                        WHERE ws.IsDeleted = 0
                    ) AS t
                        INNER JOIN dbo.Category c ON c.id = t.CategoryId
                    WHERE t.RowNumber BETWEEN @PageStart AND @PageEnd
                    {sortOrder.Replace("#", "t")}",
                    MapWebSite,
                    new
                {
                    PageStart = 1 + ((searchObject.PageNumber - 1) * searchObject.PageSize),
                    PageEnd   = searchObject.PageNumber *searchObject.PageSize
                },
                    _repositorySession.CurrentTransaction);
            }

            return(sites, count);
        }
예제 #2
0
 public async Task <(IEnumerable <WebSite> webSites, int count)> GetWebSites(WebSiteSearchObject searchObject)
 {
     return(await _webSiteRepository.FindByFilter(searchObject));
 }