@@ -34,41 +34,36 @@ public async Task<IActionResult> OnGetAsync()
3434
3535 public async Task < IActionResult > OnPostAsync ( )
3636 {
37- if ( Criteria . Page <= 0 )
38- {
39- Criteria . Page = 1 ;
40- }
41-
4237 await ExecuteSearchAsync ( ) ;
4338 return Page ( ) ;
4439 }
4540
4641 private async Task ExecuteSearchAsync ( )
4742 {
48- var pageSize = Criteria . PageSize <= 0 ? 50 : Math . Min ( Criteria . PageSize , 200 ) ;
49- var page = Criteria . Page <= 0 ? 1 : Criteria . Page ;
50-
51- var offset = ( page - 1 ) * pageSize ;
52- var limit = pageSize + 1 ;
53-
5443 var sqlBuilder = new StringBuilder ( ) ;
55- sqlBuilder . Append ( "SELECT projectid, gameid, name, slug, summary, status, downloadcount, isfeatured, primarycategoryid, classid, allowmoddistribution, gamepopularityrank, isavailable, thumbsupcount, rating, datecreated, datemodified, datereleased, latestupdate FROM project_data" ) ;
56-
57- var conditions = new List < string >
58- {
59- } ;
44+ sqlBuilder . Append (
45+ """
46+ SELECT pd.projectid, pd.gameid, pd.name, pd.slug, pd.summary, pd.status, pd.downloadcount, pd.isfeatured,
47+ pd.primarycategoryid, pd.classid, pd.allowmoddistribution, pd.gamepopularityrank,
48+ pd.isavailable, pd.thumbsupcount, pd.datecreated, pd.datemodified, pd.datereleased, pd.latestupdate,
49+ gd.name as gamename
50+ FROM project_data pd
51+ LEFT JOIN game_data gd ON pd.gameid = gd.gameid
52+ """ ) ;
53+
54+ var conditions = new List < string > ( ) ;
6055
6156 await using var cmd = _conn . CreateCommand ( ) ;
6257 cmd . CommandType = CommandType . Text ;
6358
6459 if ( ! string . IsNullOrWhiteSpace ( Criteria . Query ) )
6560 {
6661 var paramName = "q" ;
67- conditions . Add ( "(name ILIKE @" + paramName + " OR slug ILIKE @" + paramName + " OR summary ILIKE @" + paramName + ")" ) ;
62+ conditions . Add ( "(pd. name ILIKE @" + paramName + " OR pd. slug ILIKE @" + paramName + " OR pd. summary ILIKE @" + paramName + ")" ) ;
6863 cmd . Parameters . AddWithValue ( paramName , $ "%{ Criteria . Query . Trim ( ) } %") ;
6964 }
7065
71- if ( Criteria . Filters != null && Criteria . Filters . Count > 0 )
66+ if ( Criteria . Filters is { Count : > 0 } )
7267 {
7368 var paramIndex = 0 ;
7469 foreach ( var filter in Criteria . Filters )
@@ -101,12 +96,9 @@ private async Task ExecuteSearchAsync()
10196 sqlBuilder . Append ( string . Join ( " AND " , conditions ) ) ;
10297 }
10398
104- sqlBuilder . Append ( " ORDER BY latestupdate DESC, downloadcount DESC" ) ;
105- sqlBuilder . Append ( " LIMIT @limit OFFSET @offset" ) ;
99+ sqlBuilder . Append ( " ORDER BY pd.name DESC" ) ;
106100
107101 cmd . CommandText = sqlBuilder . ToString ( ) ;
108- cmd . Parameters . AddWithValue ( "limit" , limit ) ;
109- cmd . Parameters . AddWithValue ( "offset" , offset ) ;
110102
111103 if ( _conn . State != ConnectionState . Open )
112104 {
@@ -123,20 +115,14 @@ private async Task ExecuteSearchAsync()
123115 try
124116 {
125117 await using var reader = await cmd . ExecuteReaderAsync ( ) ;
126- var rowCount = 0 ;
127118
128119 while ( await reader . ReadAsync ( ) )
129120 {
130- if ( rowCount >= pageSize )
131- {
132- ViewModel . HasNextPage = true ;
133- break ;
134- }
135-
136121 var result = new ProjectSearchResult
137122 {
138123 ProjectId = reader . GetInt64 ( reader . GetOrdinal ( "projectid" ) ) ,
139124 GameId = reader . GetInt32 ( reader . GetOrdinal ( "gameid" ) ) ,
125+ GameName = reader . GetString ( reader . GetOrdinal ( "gamename" ) ) ,
140126 Name = reader . GetString ( reader . GetOrdinal ( "name" ) ) ,
141127 Slug = reader . GetString ( reader . GetOrdinal ( "slug" ) ) ,
142128 Summary = reader . GetString ( reader . GetOrdinal ( "summary" ) ) ,
@@ -156,7 +142,6 @@ private async Task ExecuteSearchAsync()
156142 } ;
157143
158144 results . Add ( result ) ;
159- rowCount ++ ;
160145 }
161146 }
162147 catch ( Exception ex )
@@ -175,71 +160,75 @@ private static bool TryGetColumnInfo(string field, out string columnName, out Fi
175160 switch ( field )
176161 {
177162 case "GameId" :
178- columnName = "gameid" ;
163+ columnName = "pd. gameid" ;
179164 valueType = FilterValueType . Numeric ;
180165 return true ;
181166 case "Status" :
182- columnName = "status" ;
167+ columnName = "pd. status" ;
183168 valueType = FilterValueType . Numeric ;
184169 return true ;
185170 case "DownloadCount" :
186- columnName = "downloadcount" ;
171+ columnName = "pd. downloadcount" ;
187172 valueType = FilterValueType . Numeric ;
188173 return true ;
189174 case "IsFeatured" :
190- columnName = "isfeatured" ;
175+ columnName = "pd. isfeatured" ;
191176 valueType = FilterValueType . Boolean ;
192177 return true ;
193178 case "PrimaryCategoryId" :
194- columnName = "primarycategoryid" ;
179+ columnName = "pd. primarycategoryid" ;
195180 valueType = FilterValueType . Numeric ;
196181 return true ;
197182 case "ClassId" :
198- columnName = "classid" ;
183+ columnName = "pd. classid" ;
199184 valueType = FilterValueType . Numeric ;
200185 return true ;
201186 case "AllowModDistribution" :
202- columnName = "allowmoddistribution" ;
187+ columnName = "pd. allowmoddistribution" ;
203188 valueType = FilterValueType . Boolean ;
204189 return true ;
205190 case "GamePopularityRank" :
206- columnName = "gamepopularityrank" ;
191+ columnName = "pd. gamepopularityrank" ;
207192 valueType = FilterValueType . Numeric ;
208193 return true ;
209194 case "IsAvailable" :
210- columnName = "isavailable" ;
195+ columnName = "pd. isavailable" ;
211196 valueType = FilterValueType . Boolean ;
212197 return true ;
213198 case "ThumbsUpCount" :
214- columnName = "thumbsupcount" ;
215- valueType = FilterValueType . Numeric ;
216- return true ;
217- case "Rating" :
218- columnName = "rating" ;
199+ columnName = "pd.thumbsupcount" ;
219200 valueType = FilterValueType . Numeric ;
220201 return true ;
221202 case "DateCreated" :
222- columnName = "datecreated" ;
203+ columnName = "pd. datecreated" ;
223204 valueType = FilterValueType . DateTime ;
224205 return true ;
225206 case "DateModified" :
226- columnName = "datemodified" ;
207+ columnName = "pd. datemodified" ;
227208 valueType = FilterValueType . DateTime ;
228209 return true ;
229210 case "DateReleased" :
230- columnName = "datereleased" ;
211+ columnName = "pd. datereleased" ;
231212 valueType = FilterValueType . DateTime ;
232213 return true ;
233214 case "LatestUpdate" :
234- columnName = "latestupdate" ;
215+ columnName = "pd. latestupdate" ;
235216 valueType = FilterValueType . DateTime ;
236217 return true ;
237218 case "Name" :
238- columnName = "name" ;
219+ columnName = "pd. name" ;
239220 valueType = FilterValueType . String ;
240221 return true ;
241222 case "Slug" :
242- columnName = "slug" ;
223+ columnName = "pd.slug" ;
224+ valueType = FilterValueType . String ;
225+ return true ;
226+ case "Summary" :
227+ columnName = "pd.summary" ;
228+ valueType = FilterValueType . String ;
229+ return true ;
230+ case "GameName" :
231+ columnName = "gd.name" ;
243232 valueType = FilterValueType . String ;
244233 return true ;
245234 default :
@@ -318,7 +307,7 @@ private static bool TryBuildFilterCondition(
318307
319308 private static object ParseNumeric ( string value , string columnName )
320309 {
321- if ( columnName is "status" or "primarycategoryid" or "classid" )
310+ if ( columnName is "pd. status" or "pd. primarycategoryid" or "pd. classid" )
322311 {
323312 return int . Parse ( value , CultureInfo . InvariantCulture ) ;
324313 }
0 commit comments