XperienceCommunity.QueryExtensions 2.0.0-prerelease-6-1

This is a prerelease version of XperienceCommunity.QueryExtensions.
dotnet add package XperienceCommunity.QueryExtensions --version 2.0.0-prerelease-6-1                
NuGet\Install-Package XperienceCommunity.QueryExtensions -Version 2.0.0-prerelease-6-1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="XperienceCommunity.QueryExtensions" Version="2.0.0-prerelease-6-1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add XperienceCommunity.QueryExtensions --version 2.0.0-prerelease-6-1                
#r "nuget: XperienceCommunity.QueryExtensions, 2.0.0-prerelease-6-1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install XperienceCommunity.QueryExtensions as a Cake Addin
#addin nuget:?package=XperienceCommunity.QueryExtensions&version=2.0.0-prerelease-6-1&prerelease

// Install XperienceCommunity.QueryExtensions as a Cake Tool
#tool nuget:?package=XperienceCommunity.QueryExtensions&version=2.0.0-prerelease-6-1&prerelease                

Xperience Query Extensions

GitHub Actions CI: Build

Publish Packages to NuGet

NuGet Package

This package provides a set of extension methods for Kentico Xperience 13.0 DocumentQuery, MultiDocumentQuery, ObjectQuery, and IPageRetriever data access APIs.

Dependencies

This package is compatible with ASP.NET Core 3.1 → ASP.NET Core 5 applications or libraries integrated with Kentico Xperience 13.0.

How to Use?

  1. Install the NuGet package in your ASP.NET Core project (or class library)

    dotnet add package XperienceCommunity.QueryExtensions
    
  2. Add the correct using to have the extensions appear in intellisense

    using XperienceCommunity.QueryExtensions.Documents;

    using XperienceCommunity.QueryExtensions.Objects;

    using XperienceCommunity.QueryExtensions.Collections;

    The extension methods are all in explicit namespaces to prevent conflicts with extensions that Xperience might add in the future or extensions that the developer might have already created.

    If you are using C# 10, you can apply these globally with C# 10 implicit usings

Extension Methods

DocumentQuery

Prerequisites
using XperienceCommunity.QueryExtensions.Documents;
Examples

These work for both DocumentQuery<T> and MultiDocumentQuery

public void QueryDocument(Guid nodeGuid)
{
    var query = DocumentHelper.GetDocuments()
        .WhereNodeGUIDEquals(nodeGuid);
}
public void QueryDocument(int nodeID)
{
    var query = DocumentHelper.GetDocuments()
        .WhereNodeIDEquals(nodeID);
}
public void QueryDocument(int documentID)
{
    var query = DocumentHelper.GetDocuments()
        .WhereDocumentIDEquals(documentID);
}
var query = DocumentHelper.GetDocuments()
    .OrderByNodeOrder();
var query = DocumentHelper.GetDocuments()
    .Tap(q => 
    {
        // access the query 'q'
    });
bool condition = ...

var query = DocumentHelper.GetDocuments()
    .If(condition, q => 
    {
        // when condition is true
    });
bool condition = ...

var query = DocumentHelper.GetDocuments()
    .If(condition, 
    q => 
    {
        // when condition is true
    }, 
    q =>
    {
        // when condition is false
    });
var query = DocumentHelper.GetDocuments()
    .OrderByDescending(nameof(TreeNode.NodeID))
    .TopN(1)
    .DebugQuery();

/*
--- BEGIN [path\to\your\app\Program.cs] QUERY ---


DECLARE @DocumentCulture nvarchar(max) = N'en-US';

SELECT TOP 1 *
FROM View_CMS_Tree_Joined AS V WITH (NOLOCK, NOEXPAND) LEFT OUTER JOIN COM_SKU AS S WITH (NOLOCK) ON [V].[NodeSKUID] = [S].[SKUID]
WHERE [DocumentCulture] = @DocumentCulture
ORDER BY NodeID DESC


--- END [path\to\your\app\Program.cs] QUERY ---
*/
var query = DocumentHelper.GetDocuments()
    .OrderByDescending(nameof(TreeNode.NodeID))
    .TopN(1)
    .DebugQuery("Newest Document");

/*
--- BEGIN [Newest Document] QUERY ---


DECLARE @DocumentCulture nvarchar(max) = N'en-US';

SELECT TOP 1 *
FROM View_CMS_Tree_Joined AS V WITH (NOLOCK, NOEXPAND) LEFT OUTER JOIN COM_SKU AS S WITH (NOLOCK) ON [V].[NodeSKUID] = [S].[SKUID]
WHERE [DocumentCulture] = @DocumentCulture
ORDER BY NodeID DESC


--- END [Newest Document] QUERY ---
*/
var query = DocumentHelper.GetDocuments()
    .OrderByDescending(nameof(TreeNode.NodeID))
    .TopN(1)
    .TapQueryText(fullQueryText =>
    {
        Debug.WriteLine(fullQueryText);
    })
    .WhereEquals(...)
public void QueryDatabase(ILogger logger)
{
    var query = DocumentHelper.GetDocuments()
        .OrderByDescending(nameof(TreeNode.NodeID))
        .TopN(1)
        .LogQuery(logger, "Logged Query");
}
var query = DocumentHelper.GetDocuments()
    .Where(w => w.WhereInPath("path1", "path2"));

ObjectQuery

Prerequisites
using XperienceCommunity.QueryExtensions.Objects;
Examples
return UserInfo.Provider.Get()
    .Tap(q =>
    {
        // access the query
    });
bool condition = ...

var query = UserInfo.Provider.Get()
    .If(condition, q => 
    {
        // when condition is true
    });
bool condition = ...

var query = UserInfo.Provider.Get()
    .If(condition, 
    q => 
    {
        // when condition is true
    }, 
    q =>
    {
        // when condition is false
    });
var query = UserInfo.Provider.Get()
    .OrderByDescending(nameof(UserInfo.UserLastModified))
    .TopN(1)
    .DebugQuery();

/*
--- BEGIN [path\to\your\app\Program.cs] QUERY ---


SELECT TOP 1 *
FROM CMS_User
ORDER BY UserLastModified DESC


--- END [path\to\your\app\Program.cs] QUERY ---
*/
var query = UserInfo.Provider.Get()
    .OrderByDescending(nameof(UserInfo.UserLastModified))
    .TopN(1)
    .DebugQuery("User");

/*
--- QUERY [User] START ---


SELECT TOP 1 *
FROM CMS_User
ORDER BY UserLastModified DESC


--- QUERY [User] END ---
*/
public void QueryDatabase(ILogger logger)
{
    var query = UserInfo.Provider.Get()
        .OrderByDescending(nameof(UserInfo.UserLastModified))
        .TopN(1)
        .LogQuery(logger, "Logged User Query");
}
var query = UserInfo.Provider.Get()
    .TapQueryText(text =>
    {
        // do something with the query text
    });
var query = UserInfo.Provider.Get()
    .Source(s => s.InnerJoin<UserSettingInfo>(
        "UserID", 
        "UserSettingUserID", 
        "MY_ALIAS",
        additionalCondition: new WhereCondition("MY_ALIAS.UserWaitingForApproval", QueryOperator.Equals, true),
        hints: new[] { SqlHints.NOLOCK }))
    .TopN(1)
    .DebugQuery("User");

/*
--- QUERY [User] START ---


SELECT TOP 1 *
FROM CMS_User
INNER JOIN CMS_UserSetting AS MY_ALIAS WITH (NOLOCK) ON UserID = MY_ALIAS.UserSettingUserID AND MY_ALIAS.UserWaitingForApproval = 1
ORDER BY UserLastModified DESC


--- QUERY [User] END ---
*/
// ExecuteAsync returns a populated dataset with all the columns returned by the query.
// When there are no results, dataset.Tables[0] will still be populated with an empty DataTable.

var dataset = await UserInfo.Provider.Get()
    .Source(source => source
        .InnerJoin<UserSettingInfo>(
            "UserID", 
            "UserSettingUserID", 
            "MY_ALIAS")
        .InnerJoin<CustomerInfo>(
            "CustomerUserID",
            "UserID",
            "C",
            )
        )
    .Columns("UserID", "UserSettingID", "CustomerID")
    .ExecuteAsync();
    
foreach (var row in dataset.Tables[0].Rows)
{
    Console.WriteLine($"User: {row["UserID"]}, User Setting: {row["UserSettingID"]}, Customer: {row["CustomerID"]}");
}

Collections

Requirements
using XperienceCommunity.QueryExtensions.Collections;
Examples
TreeNode? page = await retriever
    .RetrieveAsync<TreeNode>(q => q.TopN(1), cancellationToken: token)
    .FirstOrDefaultAsync();
IList<TreeNode> pages = await retriever
    .RetrieveAsync<TreeNode>(cancellationToken: token)
    .ToListAsync();
IList<TreeNode> pages = await retriever
    .RetrieveAsync<TreeNode>(cancellationToken: token)
    .ToArrayAsync();

PageRetriever

Requirements
using Kentico.Content.Web.Mvc;
Examples
void GetPages(int pageIndex, int pageSize)
{
    var result = await retriever.RetrievePagedAsync<TreeNode>(
        pageIndex,
        pageSize,
        q => q.OrderByNodeOrder(),
        cancellationToken: token);

    int total = result.TotalRecords;
    List<TreeNode> pages = result.Items;

    // or

    var (totalRecords, pages) = await retriever.RetrievePagedAsync<TreeNode>(
        pageIndex,
        pageSize,
        q => q.OrderByNodeOrder(),
        cancellationToken: token);
}

XperienceCommunityConnectionHelper

Examples
var dataSet = await XperienceCommunityConnectionHelper.ExecuteQueryAsync("CMS.User", "GetAllUsersCustom");
string queryText = @"
SELECT *
FROM CMS_User
WHERE UserID = @UserID
"

var queryParams = new QueryDataParameters
{
    { "UserID", 3 }
};

var dataSet = await XperienceCommunityConnectionHelper.ExecuteQueryAsync(queryText, queryParams, token: token);

References

.NET

Kentico Xperience

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on XperienceCommunity.QueryExtensions:

Package Downloads
XperienceCommunity.Baseline.Core.Library.KX13

The Baseline a set of Core Systems, Tools, and Structure to ensure a superior Kentico Website that's easy to migrate, for Kentico Xperience 13 and eventually Xperience by Kentico

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
2.0.0-prerelease-6-1 758 1/26/2023
1.3.0-prerelease-5-1 643 11/15/2022
1.2.0 18,920 10/5/2022
1.2.0-prerelease-4-1 635 10/4/2022
1.1.0 10,674 4/10/2022
1.1.0-prerelease-3-1 672 4/10/2022
1.1.0-prerelease-2-1 638 4/10/2022
1.0.0 4,053 1/2/2022
1.0.0-beta.5 138 1/2/2022
1.0.0-beta.4 139 1/2/2022
1.0.0-beta.3 204 11/18/2021
1.0.0-beta.2 201 11/18/2021
1.0.0-beta.1 173 11/4/2021