diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 7f98da7f1a..575923d62c 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"jetbrains.resharper.globaltools": {
- "version": "2023.3.0-eap08",
+ "version": "2023.3.2",
"commands": [
"jb"
]
@@ -27,4 +27,4 @@
]
}
}
-}
+}
\ No newline at end of file
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index ac728e4a58..61a3b8222c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -39,13 +39,15 @@ jobs:
permissions:
contents: read
steps:
+ - name: Tune GitHub-hosted runner network
+ uses: smorimoto/tune-github-hosted-runner-network@v1
- name: Setup PostgreSQL
uses: ikalnytskyi/action-setup-postgres@v4
with:
username: postgres
password: postgres
- name: Setup .NET
- uses: actions/setup-dotnet@v3
+ uses: actions/setup-dotnet@v4
with:
dotnet-version: |
6.0.x
@@ -143,7 +145,7 @@ jobs:
dotnet pack --no-build --configuration Release --output $env:GITHUB_WORKSPACE/artifacts/packages /p:VersionSuffix=$env:PACKAGE_VERSION_SUFFIX
- name: Upload packages to artifacts
if: matrix.os == 'ubuntu-latest'
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: packages
path: artifacts/packages
@@ -166,7 +168,7 @@ jobs:
Copy-Item -Recurse home/assets/* _site/styles/
- name: Upload documentation to artifacts
if: matrix.os == 'ubuntu-latest'
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: documentation
path: docs/_site
@@ -181,8 +183,10 @@ jobs:
permissions:
contents: read
steps:
+ - name: Tune GitHub-hosted runner network
+ uses: smorimoto/tune-github-hosted-runner-network@v1
- name: Setup .NET
- uses: actions/setup-dotnet@v3
+ uses: actions/setup-dotnet@v4
with:
dotnet-version: |
6.0.x
@@ -197,7 +201,7 @@ jobs:
run: |
$inspectCodeOutputPath = Join-Path $env:RUNNER_TEMP 'jetbrains-inspectcode-results.xml'
Write-Output "INSPECT_CODE_OUTPUT_PATH=$inspectCodeOutputPath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- dotnet jb inspectcode JsonApiDotNetCore.sln --build --dotnetcoresdk=$(dotnet --version) --output="$inspectCodeOutputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --properties:ContinuousIntegrationBuild=false --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
+ dotnet jb inspectcode JsonApiDotNetCore.sln --build --dotnetcoresdk=$(dotnet --version) --output="$inspectCodeOutputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --properties:ContinuousIntegrationBuild=false --properties:RunAnalyzers=false --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
- name: Verify outcome
shell: pwsh
run: |
@@ -234,8 +238,10 @@ jobs:
permissions:
contents: read
steps:
+ - name: Tune GitHub-hosted runner network
+ uses: smorimoto/tune-github-hosted-runner-network@v1
- name: Setup .NET
- uses: actions/setup-dotnet@v3
+ uses: actions/setup-dotnet@v4
with:
dotnet-version: |
6.0.x
@@ -260,13 +266,13 @@ jobs:
$baseCommitHash = git rev-parse HEAD~1
Write-Output "Running code cleanup on commit range $baseCommitHash..$headCommitHash in pull request."
- dotnet regitlint -s JsonApiDotNetCore.sln --print-command --skip-tool-check --max-runs=5 --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f commits -a $headCommitHash -b $baseCommitHash --fail-on-diff --print-diff
+ dotnet regitlint -s JsonApiDotNetCore.sln --print-command --skip-tool-check --max-runs=5 --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --properties:RunAnalyzers=false --jb --verbosity=WARN -f commits -a $headCommitHash -b $baseCommitHash --fail-on-diff --print-diff
- name: CleanupCode (on branch)
if: github.event_name == 'push' || github.event_name == 'release'
shell: pwsh
run: |
Write-Output "Running code cleanup on all files."
- dotnet regitlint -s JsonApiDotNetCore.sln --print-command --skip-tool-check --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN --fail-on-diff --print-diff
+ dotnet regitlint -s JsonApiDotNetCore.sln --print-command --skip-tool-check --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --properties:RunAnalyzers=false --jb --verbosity=WARN --fail-on-diff --print-diff
publish:
timeout-minutes: 60
@@ -277,8 +283,10 @@ jobs:
packages: write
contents: write
steps:
+ - name: Tune GitHub-hosted runner network
+ uses: smorimoto/tune-github-hosted-runner-network@v1
- name: Download artifacts
- uses: actions/download-artifact@v3
+ uses: actions/download-artifact@v4
- name: Publish to GitHub Packages
if: github.event_name == 'push' || github.event_name == 'release'
env:
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 9a7df30558..f12a02041b 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -24,7 +24,7 @@ jobs:
language: [ 'csharp' ]
steps:
- name: Setup .NET
- uses: actions/setup-dotnet@v3
+ uses: actions/setup-dotnet@v4
with:
dotnet-version: |
6.0.x
@@ -32,12 +32,12 @@ jobs:
- name: Git checkout
uses: actions/checkout@v4
- name: Initialize CodeQL
- uses: github/codeql-action/init@v2
+ uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
- name: Autobuild
- uses: github/codeql-action/autobuild@v2
+ uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v2
+ uses: github/codeql-action/analyze@v3
with:
category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/qodana.yml b/.github/workflows/qodana.yml
index 9225d9f816..f1a64da824 100644
--- a/.github/workflows/qodana.yml
+++ b/.github/workflows/qodana.yml
@@ -22,12 +22,12 @@ jobs:
ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit
fetch-depth: 0 # a full history is required for pull request analysis
- name: 'Qodana Scan'
- uses: JetBrains/qodana-action@v2023.2
+ uses: JetBrains/qodana-action@v2023.3
env:
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }}
- name: Upload results to artifacts on failure
if: failure()
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: qodana_results
path: ${{ runner.temp }}/qodana/results
diff --git a/JsonApiDotNetCore.sln b/JsonApiDotNetCore.sln
index 44df1d6c00..15ae0a00e3 100644
--- a/JsonApiDotNetCore.sln
+++ b/JsonApiDotNetCore.sln
@@ -10,11 +10,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
.gitignore = .gitignore
+ .github\workflows\build.yml = .github\workflows\build.yml
CodingGuidelines.ruleset = CodingGuidelines.ruleset
CSharpGuidelinesAnalyzer.config = CSharpGuidelinesAnalyzer.config
Directory.Build.props = Directory.Build.props
- tests.runsettings = tests.runsettings
package-versions.props = package-versions.props
+ tests.runsettings = tests.runsettings
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{026FBC6C-AF76-4568-9B87-EC73457899FD}"
diff --git a/JsonApiDotNetCore.sln.DotSettings b/JsonApiDotNetCore.sln.DotSettings
index c25cadd7ad..a5b6860b2d 100644
--- a/JsonApiDotNetCore.sln.DotSettings
+++ b/JsonApiDotNetCore.sln.DotSettings
@@ -57,6 +57,7 @@ JsonApiDotNetCore.ArgumentGuard.NotNull($EXPR$);
WARNING
WARNING
WARNING
+ DO_NOT_SHOW
WARNING
SUGGESTION
HINT
@@ -98,6 +99,7 @@ JsonApiDotNetCore.ArgumentGuard.NotNull($EXPR$);
SUGGESTION
SUGGESTION
WARNING
+ True
SUGGESTION
<?xml version="1.0" encoding="utf-16"?><Profile name="JADNC Full Cleanup"><XMLReformatCode>True</XMLReformatCode><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="True" ArrangeCodeBodyStyle="True" ArrangeVarStyle="True" ArrangeTrailingCommas="True" ArrangeObjectCreation="True" ArrangeDefaultValue="True" ArrangeNamespaces="True" ArrangeNullCheckingPattern="True" /><CssAlphabetizeProperties>True</CssAlphabetizeProperties><JsInsertSemicolon>True</JsInsertSemicolon><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CorrectVariableKindsDescriptor>True</CorrectVariableKindsDescriptor><VariablesToInnerScopesDescriptor>True</VariablesToInnerScopesDescriptor><StringToTemplatesDescriptor>True</StringToTemplatesDescriptor><JsReformatCode>True</JsReformatCode><JsFormatDocComments>True</JsFormatDocComments><RemoveRedundantQualifiersTs>True</RemoveRedundantQualifiersTs><OptimizeImportsTs>True</OptimizeImportsTs><OptimizeReferenceCommentsTs>True</OptimizeReferenceCommentsTs><PublicModifierStyleTs>True</PublicModifierStyleTs><ExplicitAnyTs>True</ExplicitAnyTs><TypeAnnotationStyleTs>True</TypeAnnotationStyleTs><RelativePathStyleTs>True</RelativePathStyleTs><AsInsteadOfCastTs>True</AsInsteadOfCastTs><HtmlReformatCode>True</HtmlReformatCode><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSUseAutoProperty>True</CSUseAutoProperty><CSMakeFieldReadonly>True</CSMakeFieldReadonly><CSMakeAutoPropertyGetOnly>True</CSMakeAutoPropertyGetOnly><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CssReformatCode>True</CssReformatCode><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><CSharpFormatDocComments>True</CSharpFormatDocComments><CSReorderTypeMembers>True</CSReorderTypeMembers><XAMLCollapseEmptyTags>False</XAMLCollapseEmptyTags><CSReformatInactiveBranches>True</CSReformatInactiveBranches></Profile>
JADNC Full Cleanup
@@ -157,6 +159,7 @@ JsonApiDotNetCore.ArgumentGuard.NotNull($EXPR$);
WRAP_IF_LONG
CHOP_ALWAYS
CHOP_ALWAYS
+ WRAP_IF_LONG
True
True
2
diff --git a/WarningSeverities.DotSettings b/WarningSeverities.DotSettings
index 5c641e606f..a0fae5acd2 100644
--- a/WarningSeverities.DotSettings
+++ b/WarningSeverities.DotSettings
@@ -69,6 +69,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -122,6 +123,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
@@ -196,6 +198,7 @@
WARNING
WARNING
WARNING
+ WARNING
WARNING
WARNING
WARNING
diff --git a/benchmarks/Program.cs b/benchmarks/Program.cs
index 818b9ab5e5..b1e3307931 100644
--- a/benchmarks/Program.cs
+++ b/benchmarks/Program.cs
@@ -9,14 +9,13 @@ internal static class Program
{
private static void Main(string[] args)
{
- var switcher = new BenchmarkSwitcher(new[]
- {
+ var switcher = new BenchmarkSwitcher([
typeof(ResourceDeserializationBenchmarks),
typeof(OperationsDeserializationBenchmarks),
typeof(ResourceSerializationBenchmarks),
typeof(OperationsSerializationBenchmarks),
typeof(QueryStringParserBenchmarks)
- });
+ ]);
switcher.Run(args);
}
diff --git a/cleanupcode.ps1 b/cleanupcode.ps1
index 3ab4d620ae..b35d1cb215 100644
--- a/cleanupcode.ps1
+++ b/cleanupcode.ps1
@@ -28,17 +28,17 @@ if ($revision) {
if ($baseCommitHash -eq $headCommitHash) {
Write-Output "Running code cleanup on staged/unstaged files."
- dotnet regitlint -s JsonApiDotNetCore.sln --print-command --skip-tool-check --max-runs=5 --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f staged,modified
+ dotnet regitlint -s JsonApiDotNetCore.sln --print-command --skip-tool-check --max-runs=5 --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --properties:RunAnalyzers=false --jb --verbosity=WARN -f staged,modified
VerifySuccessExitCode
}
else {
Write-Output "Running code cleanup on commit range $baseCommitHash..$headCommitHash, including staged/unstaged files."
- dotnet regitlint -s JsonApiDotNetCore.sln --print-command --skip-tool-check --max-runs=5 --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN -f staged,modified,commits -a $headCommitHash -b $baseCommitHash
+ dotnet regitlint -s JsonApiDotNetCore.sln --print-command --skip-tool-check --max-runs=5 --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --properties:RunAnalyzers=false --jb --verbosity=WARN -f staged,modified,commits -a $headCommitHash -b $baseCommitHash
VerifySuccessExitCode
}
}
else {
Write-Output "Running code cleanup on all files."
- dotnet regitlint -s JsonApiDotNetCore.sln --print-command --skip-tool-check --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --verbosity=WARN
+ dotnet regitlint -s JsonApiDotNetCore.sln --print-command --skip-tool-check --jb --dotnetcoresdk=$(dotnet --version) --jb-profile="JADNC Full Cleanup" --jb --properties:Configuration=Release --jb --properties:RunAnalyzers=false --jb --verbosity=WARN
VerifySuccessExitCode
}
diff --git a/inspectcode.ps1 b/inspectcode.ps1
index 14c3eb1736..aa816da5e9 100644
--- a/inspectcode.ps1
+++ b/inspectcode.ps1
@@ -10,7 +10,7 @@ if ($LastExitCode -ne 0) {
$outputPath = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), 'jetbrains-inspectcode-results.xml')
$resultPath = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), 'jetbrains-inspectcode-results.html')
-dotnet jb inspectcode JsonApiDotNetCore.sln --dotnetcoresdk=$(dotnet --version) --build --output="$outputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
+dotnet jb inspectcode JsonApiDotNetCore.sln --dotnetcoresdk=$(dotnet --version) --build --output="$outputPath" --profile=WarningSeverities.DotSettings --properties:Configuration=Release --properties:RunAnalyzers=false --severity=WARNING --verbosity=WARN -dsl=GlobalAll -dsl=GlobalPerProduct -dsl=SolutionPersonal -dsl=ProjectPersonal
if ($LastExitCode -ne 0) {
throw "Code inspection failed with exit code $LastExitCode"
diff --git a/package-versions.props b/package-versions.props
index 7912066251..a836b2cc01 100644
--- a/package-versions.props
+++ b/package-versions.props
@@ -9,20 +9,21 @@
0.13.*
1.0.*
- 34.0.*
+ 35.2.*
4.8.*
6.0.*
2.1.*
6.12.*
2.3.*
- 1.3.*
+ 2.0.*
8.0.*
13.20.*
13.0.*
8.0.*
6.5.*
17.8.*
- 2.5.*
+ 2.6.*
+ 2.5.*
diff --git a/src/Examples/DapperExample/Controllers/OperationsController.cs b/src/Examples/DapperExample/Controllers/OperationsController.cs
index 979e6c9cd7..6fe0eedd1d 100644
--- a/src/Examples/DapperExample/Controllers/OperationsController.cs
+++ b/src/Examples/DapperExample/Controllers/OperationsController.cs
@@ -6,11 +6,6 @@
namespace DapperExample.Controllers;
-public sealed class OperationsController : JsonApiOperationsController
-{
- public OperationsController(IJsonApiOptions options, IResourceGraph resourceGraph, ILoggerFactory loggerFactory, IOperationsProcessor processor,
- IJsonApiRequest request, ITargetedFields targetedFields)
- : base(options, resourceGraph, loggerFactory, processor, request, targetedFields)
- {
- }
-}
+public sealed class OperationsController(
+ IJsonApiOptions options, IResourceGraph resourceGraph, ILoggerFactory loggerFactory, IOperationsProcessor processor, IJsonApiRequest request,
+ ITargetedFields targetedFields) : JsonApiOperationsController(options, resourceGraph, loggerFactory, processor, request, targetedFields);
diff --git a/src/Examples/DapperExample/Data/RotatingList.cs b/src/Examples/DapperExample/Data/RotatingList.cs
index 67c19bea4a..278c34140a 100644
--- a/src/Examples/DapperExample/Data/RotatingList.cs
+++ b/src/Examples/DapperExample/Data/RotatingList.cs
@@ -16,16 +16,11 @@ public static RotatingList Create(int count, Func createElement)
}
}
-internal sealed class RotatingList
+internal sealed class RotatingList(IList elements)
{
private int _index = -1;
- public IList Elements { get; }
-
- public RotatingList(IList elements)
- {
- Elements = elements;
- }
+ public IList Elements { get; } = elements;
public T GetNext()
{
diff --git a/src/Examples/DapperExample/Repositories/ResultSetMapper.cs b/src/Examples/DapperExample/Repositories/ResultSetMapper.cs
index 61421d7331..4352b6c552 100644
--- a/src/Examples/DapperExample/Repositories/ResultSetMapper.cs
+++ b/src/Examples/DapperExample/Repositories/ResultSetMapper.cs
@@ -166,14 +166,9 @@ public IReadOnlyCollection GetResources()
return _primaryResourcesInOrder.DistinctBy(resource => resource.Id).ToList();
}
- private sealed class IncludeElementWalker
+ private sealed class IncludeElementWalker(IncludeExpression include)
{
- private readonly IncludeExpression _include;
-
- public IncludeElementWalker(IncludeExpression include)
- {
- _include = include;
- }
+ private readonly IncludeExpression _include = include;
public IEnumerable BreadthFirstEnumerate()
{
diff --git a/src/Examples/DapperExample/TranslationToSql/Builders/DeleteOneToOneStatementBuilder.cs b/src/Examples/DapperExample/TranslationToSql/Builders/DeleteOneToOneStatementBuilder.cs
index 5a1293d41b..3ea368b299 100644
--- a/src/Examples/DapperExample/TranslationToSql/Builders/DeleteOneToOneStatementBuilder.cs
+++ b/src/Examples/DapperExample/TranslationToSql/Builders/DeleteOneToOneStatementBuilder.cs
@@ -6,13 +6,8 @@
namespace DapperExample.TranslationToSql.Builders;
-internal sealed class DeleteOneToOneStatementBuilder : StatementBuilder
+internal sealed class DeleteOneToOneStatementBuilder(IDataModelService dataModelService) : StatementBuilder(dataModelService)
{
- public DeleteOneToOneStatementBuilder(IDataModelService dataModelService)
- : base(dataModelService)
- {
- }
-
public DeleteNode Build(ResourceType resourceType, string whereColumnName, object? whereValue)
{
ArgumentGuard.NotNull(resourceType);
diff --git a/src/Examples/DapperExample/TranslationToSql/Builders/DeleteResourceStatementBuilder.cs b/src/Examples/DapperExample/TranslationToSql/Builders/DeleteResourceStatementBuilder.cs
index 41794e8883..1910075a8c 100644
--- a/src/Examples/DapperExample/TranslationToSql/Builders/DeleteResourceStatementBuilder.cs
+++ b/src/Examples/DapperExample/TranslationToSql/Builders/DeleteResourceStatementBuilder.cs
@@ -6,13 +6,8 @@
namespace DapperExample.TranslationToSql.Builders;
-internal sealed class DeleteResourceStatementBuilder : StatementBuilder
+internal sealed class DeleteResourceStatementBuilder(IDataModelService dataModelService) : StatementBuilder(dataModelService)
{
- public DeleteResourceStatementBuilder(IDataModelService dataModelService)
- : base(dataModelService)
- {
- }
-
public DeleteNode Build(ResourceType resourceType, params object[] idValues)
{
ArgumentGuard.NotNull(resourceType);
diff --git a/src/Examples/DapperExample/TranslationToSql/Builders/InsertStatementBuilder.cs b/src/Examples/DapperExample/TranslationToSql/Builders/InsertStatementBuilder.cs
index 7e444b45a1..5f8374df65 100644
--- a/src/Examples/DapperExample/TranslationToSql/Builders/InsertStatementBuilder.cs
+++ b/src/Examples/DapperExample/TranslationToSql/Builders/InsertStatementBuilder.cs
@@ -6,13 +6,8 @@
namespace DapperExample.TranslationToSql.Builders;
-internal sealed class InsertStatementBuilder : StatementBuilder
+internal sealed class InsertStatementBuilder(IDataModelService dataModelService) : StatementBuilder(dataModelService)
{
- public InsertStatementBuilder(IDataModelService dataModelService)
- : base(dataModelService)
- {
- }
-
public InsertNode Build(ResourceType resourceType, IReadOnlyDictionary columnsToSet)
{
ArgumentGuard.NotNull(resourceType);
diff --git a/src/Examples/DapperExample/TranslationToSql/Builders/SqlQueryBuilder.cs b/src/Examples/DapperExample/TranslationToSql/Builders/SqlQueryBuilder.cs
index 3e3d48eb10..a082d3ecad 100644
--- a/src/Examples/DapperExample/TranslationToSql/Builders/SqlQueryBuilder.cs
+++ b/src/Examples/DapperExample/TranslationToSql/Builders/SqlQueryBuilder.cs
@@ -8,7 +8,7 @@ namespace DapperExample.TranslationToSql.Builders;
///
/// Converts s into SQL text.
///
-internal sealed class SqlQueryBuilder : SqlTreeNodeVisitor
+internal sealed class SqlQueryBuilder(DatabaseProvider databaseProvider) : SqlTreeNodeVisitor
{
private static readonly char[] SpecialCharactersInLikeDefault =
[
@@ -26,7 +26,7 @@ internal sealed class SqlQueryBuilder : SqlTreeNodeVisitor _parametersByName = [];
private int _indentDepth;
@@ -35,11 +35,6 @@ internal sealed class SqlQueryBuilder : SqlTreeNodeVisitor Parameters => _parametersByName.Values.ToDictionary(parameter => parameter.Name, parameter => parameter.Value);
- public SqlQueryBuilder(DatabaseProvider databaseProvider)
- {
- _databaseProvider = databaseProvider;
- }
-
public string GetCommand(SqlTreeNode node)
{
ArgumentGuard.NotNull(node);
@@ -488,14 +483,9 @@ private IDisposable Indent()
return new RevertIndentOnDispose(this);
}
- private sealed class RevertIndentOnDispose : IDisposable
+ private sealed class RevertIndentOnDispose(SqlQueryBuilder owner) : IDisposable
{
- private readonly SqlQueryBuilder _owner;
-
- public RevertIndentOnDispose(SqlQueryBuilder owner)
- {
- _owner = owner;
- }
+ private readonly SqlQueryBuilder _owner = owner;
public void Dispose()
{
diff --git a/src/Examples/DapperExample/TranslationToSql/Builders/UpdateClearOneToOneStatementBuilder.cs b/src/Examples/DapperExample/TranslationToSql/Builders/UpdateClearOneToOneStatementBuilder.cs
index 4ccc5fec9a..712561528d 100644
--- a/src/Examples/DapperExample/TranslationToSql/Builders/UpdateClearOneToOneStatementBuilder.cs
+++ b/src/Examples/DapperExample/TranslationToSql/Builders/UpdateClearOneToOneStatementBuilder.cs
@@ -6,13 +6,8 @@
namespace DapperExample.TranslationToSql.Builders;
-internal sealed class UpdateClearOneToOneStatementBuilder : StatementBuilder
+internal sealed class UpdateClearOneToOneStatementBuilder(IDataModelService dataModelService) : StatementBuilder(dataModelService)
{
- public UpdateClearOneToOneStatementBuilder(IDataModelService dataModelService)
- : base(dataModelService)
- {
- }
-
public UpdateNode Build(ResourceType resourceType, string setColumnName, string whereColumnName, object? whereValue)
{
ArgumentGuard.NotNull(resourceType);
diff --git a/src/Examples/DapperExample/TranslationToSql/Builders/UpdateResourceStatementBuilder.cs b/src/Examples/DapperExample/TranslationToSql/Builders/UpdateResourceStatementBuilder.cs
index 62fc3b7e20..a279ad45e5 100644
--- a/src/Examples/DapperExample/TranslationToSql/Builders/UpdateResourceStatementBuilder.cs
+++ b/src/Examples/DapperExample/TranslationToSql/Builders/UpdateResourceStatementBuilder.cs
@@ -6,13 +6,8 @@
namespace DapperExample.TranslationToSql.Builders;
-internal sealed class UpdateResourceStatementBuilder : StatementBuilder
+internal sealed class UpdateResourceStatementBuilder(IDataModelService dataModelService) : StatementBuilder(dataModelService)
{
- public UpdateResourceStatementBuilder(IDataModelService dataModelService)
- : base(dataModelService)
- {
- }
-
public UpdateNode Build(ResourceType resourceType, IReadOnlyDictionary columnsToUpdate, params object[] idValues)
{
ArgumentGuard.NotNull(resourceType);
diff --git a/src/Examples/DapperExample/TranslationToSql/DataModel/FromEntitiesDataModelService.cs b/src/Examples/DapperExample/TranslationToSql/DataModel/FromEntitiesDataModelService.cs
index 0f030debdb..b0ba38f3a5 100644
--- a/src/Examples/DapperExample/TranslationToSql/DataModel/FromEntitiesDataModelService.cs
+++ b/src/Examples/DapperExample/TranslationToSql/DataModel/FromEntitiesDataModelService.cs
@@ -12,7 +12,7 @@ namespace DapperExample.TranslationToSql.DataModel;
///
/// Derives foreign keys and connection strings from an existing Entity Framework Core model.
///
-public sealed class FromEntitiesDataModelService : BaseDataModelService
+public sealed class FromEntitiesDataModelService(IResourceGraph resourceGraph) : BaseDataModelService(resourceGraph)
{
private readonly Dictionary _foreignKeysByRelationship = [];
private readonly Dictionary _columnNullabilityPerAttribute = [];
@@ -21,11 +21,6 @@ public sealed class FromEntitiesDataModelService : BaseDataModelService
public override DatabaseProvider DatabaseProvider => AssertHasDatabaseProvider();
- public FromEntitiesDataModelService(IResourceGraph resourceGraph)
- : base(resourceGraph)
- {
- }
-
public void Initialize(DbContext dbContext)
{
_connectionString = dbContext.Database.GetConnectionString();
diff --git a/src/Examples/DapperExample/TranslationToSql/Generators/ParameterGenerator.cs b/src/Examples/DapperExample/TranslationToSql/Generators/ParameterGenerator.cs
index bd4df111fc..aaa328e68f 100644
--- a/src/Examples/DapperExample/TranslationToSql/Generators/ParameterGenerator.cs
+++ b/src/Examples/DapperExample/TranslationToSql/Generators/ParameterGenerator.cs
@@ -20,11 +20,5 @@ public void Reset()
_nameGenerator.Reset();
}
- private sealed class ParameterNameGenerator : UniqueNameGenerator
- {
- public ParameterNameGenerator()
- : base("@p")
- {
- }
- }
+ private sealed class ParameterNameGenerator() : UniqueNameGenerator("@p");
}
diff --git a/src/Examples/DapperExample/TranslationToSql/Generators/TableAliasGenerator.cs b/src/Examples/DapperExample/TranslationToSql/Generators/TableAliasGenerator.cs
index 39d5d9d702..a63bfdc01a 100644
--- a/src/Examples/DapperExample/TranslationToSql/Generators/TableAliasGenerator.cs
+++ b/src/Examples/DapperExample/TranslationToSql/Generators/TableAliasGenerator.cs
@@ -3,10 +3,4 @@ namespace DapperExample.TranslationToSql.Generators;
///
/// Generates a SQL table alias with a unique name.
///
-internal sealed class TableAliasGenerator : UniqueNameGenerator
-{
- public TableAliasGenerator()
- : base("t")
- {
- }
-}
+internal sealed class TableAliasGenerator() : UniqueNameGenerator("t");
diff --git a/src/Examples/DapperExample/TranslationToSql/Transformations/StaleColumnReferenceRewriter.cs b/src/Examples/DapperExample/TranslationToSql/Transformations/StaleColumnReferenceRewriter.cs
index 03692baf2d..a632c43e51 100644
--- a/src/Examples/DapperExample/TranslationToSql/Transformations/StaleColumnReferenceRewriter.cs
+++ b/src/Examples/DapperExample/TranslationToSql/Transformations/StaleColumnReferenceRewriter.cs
@@ -290,14 +290,9 @@ private IReadOnlyList VisitList(IEnumerable nodes, ColumnVisitMode mode
return nodes.Select(element => TypedVisit(element, mode)).ToList();
}
- private sealed class PopStackOnDispose : IDisposable
+ private sealed class PopStackOnDispose(Stack stack) : IDisposable
{
- private readonly Stack _stack;
-
- public PopStackOnDispose(Stack stack)
- {
- _stack = stack;
- }
+ private readonly Stack _stack = stack;
public void Dispose()
{
diff --git a/src/Examples/DapperExample/TranslationToSql/TreeNodes/ColumnInSelectNode.cs b/src/Examples/DapperExample/TranslationToSql/TreeNodes/ColumnInSelectNode.cs
index e4b79fe7eb..2be0561011 100644
--- a/src/Examples/DapperExample/TranslationToSql/TreeNodes/ColumnInSelectNode.cs
+++ b/src/Examples/DapperExample/TranslationToSql/TreeNodes/ColumnInSelectNode.cs
@@ -10,18 +10,13 @@ namespace DapperExample.TranslationToSql.TreeNodes;
/// SELECT t2.Id AS Id0 FROM (SELECT t1.Id FROM Users AS t1) AS t2
/// ]]>.
///
-internal sealed class ColumnInSelectNode : ColumnNode
+internal sealed class ColumnInSelectNode(ColumnSelectorNode selector, string? tableAlias) : ColumnNode(GetColumnName(selector), selector.Column.Type,
+ tableAlias)
{
- public ColumnSelectorNode Selector { get; }
+ public ColumnSelectorNode Selector { get; } = selector;
public bool IsVirtual => Selector.Alias != null || Selector.Column is ColumnInSelectNode { IsVirtual: true };
- public ColumnInSelectNode(ColumnSelectorNode selector, string? tableAlias)
- : base(GetColumnName(selector), selector.Column.Type, tableAlias)
- {
- Selector = selector;
- }
-
private static string GetColumnName(ColumnSelectorNode selector)
{
ArgumentGuard.NotNull(selector);
diff --git a/src/Examples/DapperExample/TranslationToSql/TreeNodes/ColumnInTableNode.cs b/src/Examples/DapperExample/TranslationToSql/TreeNodes/ColumnInTableNode.cs
index 8e8aab29ce..cd605e72a4 100644
--- a/src/Examples/DapperExample/TranslationToSql/TreeNodes/ColumnInTableNode.cs
+++ b/src/Examples/DapperExample/TranslationToSql/TreeNodes/ColumnInTableNode.cs
@@ -8,13 +8,8 @@ namespace DapperExample.TranslationToSql.TreeNodes;
/// FROM Users AS t1
/// ]]>.
///
-internal sealed class ColumnInTableNode : ColumnNode
+internal sealed class ColumnInTableNode(string name, ColumnType type, string? tableAlias) : ColumnNode(name, type, tableAlias)
{
- public ColumnInTableNode(string name, ColumnType type, string? tableAlias)
- : base(name, type, tableAlias)
- {
- }
-
public override TResult Accept(SqlTreeNodeVisitor visitor, TArgument argument)
{
return visitor.VisitColumnInTable(this, argument);
diff --git a/src/Examples/DapperExample/TranslationToSql/TreeNodes/CountSelectorNode.cs b/src/Examples/DapperExample/TranslationToSql/TreeNodes/CountSelectorNode.cs
index 07ad67f144..d0b9e18ca2 100644
--- a/src/Examples/DapperExample/TranslationToSql/TreeNodes/CountSelectorNode.cs
+++ b/src/Examples/DapperExample/TranslationToSql/TreeNodes/CountSelectorNode.cs
@@ -8,13 +8,8 @@ namespace DapperExample.TranslationToSql.TreeNodes;
/// SELECT COUNT(*) FROM Users
/// ]]>.
///
-internal sealed class CountSelectorNode : SelectorNode
+internal sealed class CountSelectorNode(string? alias) : SelectorNode(alias)
{
- public CountSelectorNode(string? alias)
- : base(alias)
- {
- }
-
public override TResult Accept(SqlTreeNodeVisitor visitor, TArgument argument)
{
return visitor.VisitCountSelector(this, argument);
diff --git a/src/Examples/DapperExample/TranslationToSql/TreeNodes/FromNode.cs b/src/Examples/DapperExample/TranslationToSql/TreeNodes/FromNode.cs
index 8ec4ab5c20..3d29636212 100644
--- a/src/Examples/DapperExample/TranslationToSql/TreeNodes/FromNode.cs
+++ b/src/Examples/DapperExample/TranslationToSql/TreeNodes/FromNode.cs
@@ -5,13 +5,8 @@ namespace DapperExample.TranslationToSql.TreeNodes;
/// FROM Customers AS t1
/// ]]>.
///
-internal sealed class FromNode : TableAccessorNode
+internal sealed class FromNode(TableSourceNode source) : TableAccessorNode(source)
{
- public FromNode(TableSourceNode source)
- : base(source)
- {
- }
-
public override TResult Accept(SqlTreeNodeVisitor visitor, TArgument argument)
{
return visitor.VisitFrom(this, argument);
diff --git a/src/Examples/DapperExample/TranslationToSql/TreeNodes/OneSelectorNode.cs b/src/Examples/DapperExample/TranslationToSql/TreeNodes/OneSelectorNode.cs
index c86aea6d63..a9c05301a7 100644
--- a/src/Examples/DapperExample/TranslationToSql/TreeNodes/OneSelectorNode.cs
+++ b/src/Examples/DapperExample/TranslationToSql/TreeNodes/OneSelectorNode.cs
@@ -8,13 +8,8 @@ namespace DapperExample.TranslationToSql.TreeNodes;
/// SELECT 1 FROM Users
/// ]]>.
///
-internal sealed class OneSelectorNode : SelectorNode
+internal sealed class OneSelectorNode(string? alias) : SelectorNode(alias)
{
- public OneSelectorNode(string? alias)
- : base(alias)
- {
- }
-
public override TResult Accept(SqlTreeNodeVisitor visitor, TArgument argument)
{
return visitor.VisitOneSelector(this, argument);
diff --git a/src/Examples/DapperExample/TranslationToSql/TreeNodes/OrderByTermNode.cs b/src/Examples/DapperExample/TranslationToSql/TreeNodes/OrderByTermNode.cs
index 2c3fc80b3e..89fb4c219d 100644
--- a/src/Examples/DapperExample/TranslationToSql/TreeNodes/OrderByTermNode.cs
+++ b/src/Examples/DapperExample/TranslationToSql/TreeNodes/OrderByTermNode.cs
@@ -3,12 +3,7 @@ namespace DapperExample.TranslationToSql.TreeNodes;
///
/// Represents the base type for terms in an .
///
-internal abstract class OrderByTermNode : SqlTreeNode
+internal abstract class OrderByTermNode(bool isAscending) : SqlTreeNode
{
- public bool IsAscending { get; }
-
- protected OrderByTermNode(bool isAscending)
- {
- IsAscending = isAscending;
- }
+ public bool IsAscending { get; } = isAscending;
}
diff --git a/src/Examples/DapperExample/TranslationToSql/TreeNodes/SelectorNode.cs b/src/Examples/DapperExample/TranslationToSql/TreeNodes/SelectorNode.cs
index 8a47a8af66..44ee14ea17 100644
--- a/src/Examples/DapperExample/TranslationToSql/TreeNodes/SelectorNode.cs
+++ b/src/Examples/DapperExample/TranslationToSql/TreeNodes/SelectorNode.cs
@@ -3,12 +3,7 @@ namespace DapperExample.TranslationToSql.TreeNodes;
///
/// Represents the base type for selectors in a .
///
-internal abstract class SelectorNode : SqlTreeNode
+internal abstract class SelectorNode(string? alias) : SqlTreeNode
{
- public string? Alias { get; }
-
- protected SelectorNode(string? alias)
- {
- Alias = alias;
- }
+ public string? Alias { get; } = alias;
}
diff --git a/src/Examples/DapperExample/TranslationToSql/TreeNodes/TableSourceNode.cs b/src/Examples/DapperExample/TranslationToSql/TreeNodes/TableSourceNode.cs
index 6628ed11dc..62ff5ad3ef 100644
--- a/src/Examples/DapperExample/TranslationToSql/TreeNodes/TableSourceNode.cs
+++ b/src/Examples/DapperExample/TranslationToSql/TreeNodes/TableSourceNode.cs
@@ -5,17 +5,12 @@ namespace DapperExample.TranslationToSql.TreeNodes;
///
/// Represents the base type for tabular data sources, such as database tables and sub-queries.
///
-internal abstract class TableSourceNode : SqlTreeNode
+internal abstract class TableSourceNode(string? alias) : SqlTreeNode
{
public const string IdColumnName = nameof(Identifiable