From 3fa7fb42ab1980f91c9606d30f27cb124f892b34 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 16 Jan 2020 18:24:42 +0000 Subject: [PATCH] --- server/AyaNova/Startup.cs | 2 +- server/AyaNova/biz/WidgetBiz.cs | 93 ++++++++++++++++++++++++--------- 2 files changed, 70 insertions(+), 25 deletions(-) diff --git a/server/AyaNova/Startup.cs b/server/AyaNova/Startup.cs index 19f24131..2363add1 100644 --- a/server/AyaNova/Startup.cs +++ b/server/AyaNova/Startup.cs @@ -134,7 +134,7 @@ namespace AyaNova bool LOG_SENSITIVE_DATA = false; #if (DEBUG) - // LOG_SENSITIVE_DATA = true; + LOG_SENSITIVE_DATA = false; #endif diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index 996f9d91..e24e0390 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -285,48 +285,93 @@ namespace AyaNova.Biz "; //BUILD THE QUERY - var qSelect = SqlSelectBuilder.Build(ObjectFields.WIDGET_KEY, MOCK_WIDGET_DISPLAY_TEMPLATE_JSON, listOptions.Mini); - //TODO: Turn this into a raw direct query - //Build the select fragment from the template so only selected columns get fetched - //instead of projecting it onto a c# object EF style, bypass that and use a SQL data reader instead then create the result set as per the spec doc + + //SELECT FRAGMENT COLUMNS FROM TEMPLATE + //"select clm,clm,clm" + var qSelectColumns = SqlSelectBuilder.Build(ObjectFields.WIDGET_KEY, MOCK_WIDGET_DISPLAY_TEMPLATE_JSON, listOptions.Mini); + + var qFrom = " FROM AWIDGET"; - //base query - var q = "SELECT *, xmin FROM AWIDGET "; - //GET THE FILTER / SORT + //WHERE CLAUSE and SORT CLAUSE - FILTER / SORT + + var qWhereAndOrderBy = string.Empty; if (listOptions.DataFilterId > 0) { var TheFilter = await ct.DataFilter.FirstOrDefaultAsync(x => x.Id == listOptions.DataFilterId); //BUILD WHERE AND APPEND IT - q = q + SqlFilterCriteriaBuilder.DataFilterToSQLCriteria(TheFilter, ObjectFields.ObjectFieldsList(ObjectFields.WIDGET_KEY), UserId); + qWhereAndOrderBy = qWhereAndOrderBy + SqlFilterCriteriaBuilder.DataFilterToSQLCriteria(TheFilter, ObjectFields.ObjectFieldsList(ObjectFields.WIDGET_KEY), UserId); //BUILD ORDER BY AND APPEND IT - q = q + SqlFilterOrderByBuilder.DataFilterToSQLOrderBy(TheFilter); + qWhereAndOrderBy = qWhereAndOrderBy + SqlFilterOrderByBuilder.DataFilterToSQLOrderBy(TheFilter); } else { //GET DEFAULT ORDER BY - q = q + SqlFilterOrderByBuilder.DefaultGetManyOrderBy(); + qWhereAndOrderBy = qWhereAndOrderBy + SqlFilterOrderByBuilder.DefaultGetManyOrderBy(); } + var qQuery = qSelectColumns + qFrom + qWhereAndOrderBy; -#pragma warning disable EF1000 + using (var command = ct.Database.GetDbConnection().CreateCommand()) + { - //GET THE FULL LIST OF ITEMS - var items = await ct.Widget - .FromSqlRaw(q) - .AsNoTracking() - .Skip(listOptions.Offset.Value) - .Take(listOptions.Limit.Value) - .ToArrayAsync(); - //GET THE RECORD COUNT - var totalRecordCount = await ct.Widget - .FromSqlRaw(q) - .AsNoTracking() - .CountAsync(); -#pragma warning restore EF1000 + ct.Database.OpenConnection(); + command.CommandText = qQuery; + using (var dr = command.ExecuteReader()) + { + while (dr.Read()) + { + //Build return here row by row + } + } + + } + + /* + //PAGED FETCH LIST QUERY + SELECT a.id, a.active, a.xmin, a.count, a.customfields, a.dollaramount, a.enddate, a.name, a.notes, a.roles, a.serial, a.startdate, a.tags + FROM ( + SELECT *, xmin FROM AWIDGET ORDER BY ID DESC + ) AS a + ORDER BY (SELECT 1) + LIMIT @__p_2 OFFSET @__p_1 + 2020-01-16 10:10:28.8786|INFO|Microsoft.EntityFrameworkCore.Database.Command|Executed DbCommand (1ms) [Parameters=[@__p_2='2', @__p_1='1'], CommandType='Text', CommandTimeout='30'] + SELECT a.id, a.active, a.xmin, a.count, a.customfields, a.dollaramount, a.enddate, a.name, a.notes, a.roles, a.serial, a.startdate, a.tags + FROM ( + SELECT *, xmin FROM AWIDGET ORDER BY ID DESC + ) AS a + ORDER BY (SELECT 1) + LIMIT @__p_2 OFFSET @__p_1 + + //COUNT QUERY + SELECT COUNT(*)::INT + FROM ( + SELECT *, xmin FROM AWIDGET ORDER BY ID DESC + ) AS a + 2020-01-16 10:10:28.8991|INFO|Microsoft.EntityFrameworkCore.Database.Command|Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] + SELECT COUNT(*)::INT + FROM ( + SELECT *, xmin FROM AWIDGET ORDER BY ID DESC + ) AS a + */ + // #pragma warning disable EF1000 + + // //GET THE FULL LIST OF ITEMS + // var items = await ct.Widget + // .FromSqlRaw(q) + // .AsNoTracking() + // .Skip(listOptions.Offset.Value) + // .Take(listOptions.Limit.Value) + // .ToArrayAsync(); + // //GET THE RECORD COUNT + // var totalRecordCount = await ct.Widget + // .FromSqlRaw(q) + // .AsNoTracking() + // .CountAsync(); + // #pragma warning restore EF1000 //BUILD THE PAGING LINKS PORTION var pageLinks = new PaginationLinkBuilder(Url, routeName, null, listOptions, totalRecordCount).PagingLinksObject();