diff --git a/src/OrchardCore.Modules/OrchardCore.Queries/Sql/SqlQuerySource.cs b/src/OrchardCore.Modules/OrchardCore.Queries/Sql/SqlQuerySource.cs index 5914075fd4a..c26dd1254e9 100644 --- a/src/OrchardCore.Modules/OrchardCore.Queries/Sql/SqlQuerySource.cs +++ b/src/OrchardCore.Modules/OrchardCore.Queries/Sql/SqlQuerySource.cs @@ -9,6 +9,7 @@ using Fluid.Values; using Microsoft.Extensions.Options; using OrchardCore.ContentManagement; +using OrchardCore.ContentManagement.Records; using OrchardCore.Data; using OrchardCore.Json; using OrchardCore.Liquid; @@ -71,7 +72,32 @@ public async Task ExecuteQueryAsync(Query query, IDictionary documentIds; using var transaction = await connection.BeginTransactionAsync(_session.Store.Configuration.IsolationLevel); - documentIds = await connection.QueryAsync(rawQuery, parameters, transaction); + var queryResult = await connection.QueryAsync(rawQuery, parameters, transaction); + + string column = null; + + documentIds = queryResult.Select(row => + { + var rowDictionary = (IDictionary)row; + + if (column == null) + { + if (rowDictionary.ContainsKey(nameof(ContentItemIndex.DocumentId))) + { + column = nameof(ContentItemIndex.DocumentId); + } + else + { + column = rowDictionary + .FirstOrDefault(kv => kv.Value is long).Key + ?? rowDictionary.First().Key; + } + } + + return rowDictionary.TryGetValue(column, out var documentIdObject) && documentIdObject is long documentId + ? documentId + : 0; + }); sqlQueryResults.Items = await _session.GetAsync(documentIds.ToArray()); diff --git a/src/OrchardCore.Themes/TheBlogTheme/Recipes/blog.recipe.json b/src/OrchardCore.Themes/TheBlogTheme/Recipes/blog.recipe.json index 9152abfe29c..27ac41c1c91 100644 --- a/src/OrchardCore.Themes/TheBlogTheme/Recipes/blog.recipe.json +++ b/src/OrchardCore.Themes/TheBlogTheme/Recipes/blog.recipe.json @@ -1177,9 +1177,9 @@ { "Source": "Sql", "Name": "RecentBlogPosts", - "Template": "SELECT * FROM ContentItemIndex WHERE ContentType='BlogPost' ORDER BY CreatedUtc DESC LIMIT 3", + "Template": "SELECT DocumentId FROM ContentItemIndex WHERE ContentType='BlogPost' ORDER BY CreatedUtc DESC LIMIT 3", "Schema": "[js:base64('ew0KICAgICJ0eXBlIjogIkNvbnRlbnRJdGVtL0Jsb2dQb3N0Ig0KfQ==')]", - "ReturnContentItems": true + "ReturnDocuments": true } ] }, diff --git a/src/OrchardCore.Themes/TheBlogTheme/Recipes/blog.sql.query.recipe.json b/src/OrchardCore.Themes/TheBlogTheme/Recipes/blog.sql.query.recipe.json index cc769cd0f4d..708252b105d 100644 --- a/src/OrchardCore.Themes/TheBlogTheme/Recipes/blog.sql.query.recipe.json +++ b/src/OrchardCore.Themes/TheBlogTheme/Recipes/blog.sql.query.recipe.json @@ -24,9 +24,9 @@ { "Source": "Sql", "Name": "RecentBlogPosts", - "Template": "SELECT * FROM ContentItemIndex WHERE ContentType='BlogPost' ORDER BY CreatedUtc DESC LIMIT 3", + "Template": "SELECT DocumentId FROM ContentItemIndex WHERE ContentType='BlogPost' ORDER BY CreatedUtc DESC LIMIT 3", "Schema": "[js:base64('ew0KICAgICJ0eXBlIjogIkNvbnRlbnRJdGVtL0Jsb2dQb3N0Ig0KfQ==')]", - "ReturnContentItems": true + "ReturnDocuments": true } ] } diff --git a/src/docs/reference/modules/Queries/README.md b/src/docs/reference/modules/Queries/README.md index fbbf29c7476..f046625b1aa 100644 --- a/src/docs/reference/modules/Queries/README.md +++ b/src/docs/reference/modules/Queries/README.md @@ -100,6 +100,9 @@ For Lucene queries with custom object schema, you are limited to elements stored For SQL queries, you can expose any column where property name is a column alias from the query. +!!! note + When returning documents from a SQL query, make sure your query returns a list of document IDs. This is commonly available in the `DocumentId` column, but check the tables you're querying. + Here is an example of a custom Query from a manually added table in a database : ```sql