Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Dec 8, 2025

Implementation Complete: Pre-built Expression Trees ✅

Summary

Successfully implemented pre-built expression tree caching to improve IQueryable performance by avoiding repeated lambda-to-expression-tree conversion at runtime.

Latest Updates (Per Review Feedback)

  • ✅ Fixed indentation in generated code - multi-line lambda expressions now properly indented
  • ✅ Removed unnecessary ! null-forgiving operator
  • ✅ Fixed to use explicit Expression<> type instead of as operator (C# doesn't allow as with lambdas)
  • Refactored to use direct expression initialization - expressions now initialized at field declaration, eliminating lazy initialization and null checks
  • Updated documentation in /docs/library/global-properties.md with comprehensive usage examples and notes
  • Added note about capture variables - pre-building not applied when capture variables are present
  • Added readonly modifier to static expression fields for immutability
  • Added playground toggle - New checkbox in Settings section for interactive testing

Features Implemented

  1. New Configuration Option: LinqraftUsePrebuildExpression (default: false)

    • MSBuild property: <LinqraftUsePrebuildExpression>true</LinqraftUsePrebuildExpression>
    • Playground toggle: Settings → "Pre-build Expression Trees" checkbox
    • Only applies to IQueryable (not IEnumerable)
    • Only works with named/predefined/explicit DTO types (not anonymous types)
    • Not applied when there are capture variables in the lambda expression
    • Fully documented in /docs/library/global-properties.md
  2. Expression Tree Caching with Direct Initialization

    • Static readonly fields generated at class level with hash-based unique names
    • Direct initialization at field declaration - no lazy loading or null checks
    • Improves first-access performance by avoiding initialization overhead
    • Example generated code:
    private static readonly Expression<Func<SourceType, ResultType>> _cachedExpression_HASH = s =>
        new ResultType
            {
                Property1 = s.Property1,
                Property2 = s.Property2
            };
    
    // Later in method - no null check needed:
    var converted = matchedQuery.Select(_cachedExpression_HASH);
  3. Architecture

    • ExpressionTreeBuilder.GenerateExpressionTreeField(): Generates readonly field with direct initialization
    • SelectExprInfo.GenerateStaticFields(): Virtual method for field generation
    • Clean separation between field declaration and method generation
  4. Playground Integration

    • Added toggle checkbox in Settings section for interactive testing
    • Changes reflected in real-time in generated code preview
    • Located with other configuration options for consistency

Performance Benefits

  • No runtime construction: Expression trees built once at compile-time
  • No lazy initialization overhead: Fields initialized directly at declaration with readonly modifier
  • No null checks: Expressions ready to use immediately
  • Improved first-access performance: No initialization check on first use
  • Immutability: readonly ensures expressions cannot be modified after initialization

Limitations

  • Anonymous types excluded: Cannot use pre-built expressions because the result type is compiler-generated and unknown at class-field declaration time
  • IEnumerable excluded: Feature only applies to IQueryable operations where expression trees are used
  • Captures not supported: Pre-built expressions don't work with closure variables

Testing

✅ All 130 tests passing in Linqraft.Tests

  • Regular tests continue to work without pre-built expressions
  • Feature can be enabled via MSBuild property or playground toggle

Documentation

Complete documentation added to /docs/library/global-properties.md including:

  • Configuration property definition
  • Usage examples
  • Important notes about limitations
  • Performance benefits explanation
Original prompt

This section details on the original issue you should resolve

<issue_title>proposal: Pre-build Expression Trees to improve performance</issue_title>
<issue_description>Currently, we are constructing the "as-is" expression tree, but by pre-building and caching it, we can expect performance improvements.
The expected behavior is as follows:

  • Pre-build the Expression Tree based on the information in SelectExprInfo
  • Avoid runtime construction as much as possible and use statically cached Expression Trees
    • The idea is to cache it as a variable within the generated class. A hash value is added to avoid duplication.
  • Add a new option to LinqraftConfiguration (e.g., LinqraftUsePrebuildExpression: bool) which is disabled by default
  • Apply only to IQueryable patterns, not to IEnumerable (obviously)
    </issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@coderabbitai
Copy link

coderabbitai bot commented Dec 8, 2025

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.


Comment @coderabbitai help to get the list of available commands and usage tips.

Copilot AI and others added 4 commits December 8, 2025 03:16
- Added LinqraftUsePrebuildExpression configuration option (default: false)
- Created ExpressionTreeBuilder helper class for generating cached expression fields
- Updated SelectExprInfoAnonymous to use pre-built expressions when enabled
- Updated SelectExprInfoNamed to use pre-built expressions when enabled
- Updated SelectExprInfoExplicitDto to use pre-built expressions when enabled
- Pre-built expressions only apply to IQueryable (not IEnumerable)
- Pre-built expressions are disabled when captures are used

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
- Moved static field generation from method body to class level
- Added GenerateStaticFields() virtual method to SelectExprInfo
- Updated SelectExprGroups to collect and pass static fields
- Updated GenerateSourceCodeSnippets to output static fields before methods
- Fixed null reference warning in SelectExprGroups

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
- Fixed CompilerVisibleProperty list to include LinqraftUsePrebuildExpression
- Anonymous types cannot use pre-built expressions (result type is compiler-generated)
- Pre-built expressions only work for named/predefined/explicit DTO types
- Added comprehensive tests for IQueryable with different DTO patterns
- All tests passing with pre-built expressions enabled

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
- Updated examples/Directory.Build.props with new configuration property
- Fixed playground/Services/CodeGenerationService.cs to use updated API signature
- All projects now support the new LinqraftUsePrebuildExpression configuration

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
Copilot AI changed the title [WIP] Implement pre-build expression trees for performance improvement Add pre-built expression tree caching for IQueryable operations Dec 8, 2025
Copilot AI requested a review from arika0093 December 8, 2025 03:36
Copy link
Owner

@arika0093 arika0093 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot The indentation of the generated code is inappropriate. Please correct it properly.

- Use 'var' instead of explicit type in expression initialization (line 93)
- Remove unnecessary '!' null-forgiving operator when fieldName is not null
- Fix indentation of generated multi-line lambda expressions
- Use explicit Expression<> type instead of 'as' operator (lambdas cannot use 'as')

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Dec 8, 2025

@copilot The indentation of the generated code is inappropriate. Please correct it properly.

Fixed in commit 8d68c20. The generated code now properly indents multi-line lambda expressions. The lambda body is indented at 3 levels (12 spaces) to align with the expected formatting.

Copy link
Owner

@arika0093 arika0093 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

- Updated documentation in global-properties.md for LinqraftUsePrebuildExpression
- Added note about captures not supporting pre-built expressions
- Refactored ExpressionTreeBuilder to directly initialize expression fields (no lazy init)
- Removed GenerateNamedExpressionTreeInitialization and GenerateAnonymousExpressionTreeInitialization
- Expression trees now initialized at field declaration, eliminating null checks
- Updated SelectExprInfoNamed and SelectExprInfoExplicitDto to use new approach
- Added test for multiple DTO types to verify pre-built expressions work correctly
- All 6 tests passing

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
Copy link
Owner

@arika0093 arika0093 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Please also make changes on the playground side. Add a toggle option to the Settings side and ensure it is reflected in the generated code.

…d playground toggle

- Added 'readonly' keyword to static expression fields for immutability
- Fixed indentation: ensured proper line ending with AppendLine for multi-line expressions
- Deleted Linqraft.Tests.Configuration project as requested
- Removed project reference from Linqraft.slnx
- Added toggle for LinqraftUsePrebuildExpression in playground Settings section
- All tests passing (130/130)

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Dec 8, 2025

@copilot Please also make changes on the playground side. Add a toggle option to the Settings side and ensure it is reflected in the generated code.

Added in commit 174eb45. The playground now includes a toggle checkbox in the Settings section labeled "Pre-build Expression Trees" that controls the UsePrebuildExpression configuration option. Changes are reflected in the generated code preview.

@arika0093 arika0093 marked this pull request as ready for review December 8, 2025 08:05
@arika0093 arika0093 merged commit 1761753 into main Dec 8, 2025
5 checks passed
@arika0093 arika0093 deleted the copilot/prebuild-expression-tree-optimization branch December 8, 2025 08:05
arika0093 added a commit that referenced this pull request Dec 10, 2025
* Initial plan

* Add pre-built expression tree configuration and implementation

- Added LinqraftUsePrebuildExpression configuration option (default: false)
- Created ExpressionTreeBuilder helper class for generating cached expression fields
- Updated SelectExprInfoAnonymous to use pre-built expressions when enabled
- Updated SelectExprInfoNamed to use pre-built expressions when enabled
- Updated SelectExprInfoExplicitDto to use pre-built expressions when enabled
- Pre-built expressions only apply to IQueryable (not IEnumerable)
- Pre-built expressions are disabled when captures are used

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Refactor static field generation to class level

- Moved static field generation from method body to class level
- Added GenerateStaticFields() virtual method to SelectExprInfo
- Updated SelectExprGroups to collect and pass static fields
- Updated GenerateSourceCodeSnippets to output static fields before methods
- Fixed null reference warning in SelectExprGroups

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Complete pre-built expression tree implementation

- Fixed CompilerVisibleProperty list to include LinqraftUsePrebuildExpression
- Anonymous types cannot use pre-built expressions (result type is compiler-generated)
- Pre-built expressions only work for named/predefined/explicit DTO types
- Added comprehensive tests for IQueryable with different DTO patterns
- All tests passing with pre-built expressions enabled

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Add LinqraftUsePrebuildExpression to all CompilerVisibleProperty lists

- Updated examples/Directory.Build.props with new configuration property
- Fixed playground/Services/CodeGenerationService.cs to use updated API signature
- All projects now support the new LinqraftUsePrebuildExpression configuration

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Add LinqraftUsePrebuildExpression property to project files

* Fix code generation issues per review feedback

- Use 'var' instead of explicit type in expression initialization (line 93)
- Remove unnecessary '!' null-forgiving operator when fieldName is not null
- Fix indentation of generated multi-line lambda expressions
- Use explicit Expression<> type instead of 'as' operator (lambdas cannot use 'as')

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Refactor to use direct expression initialization per review feedback

- Updated documentation in global-properties.md for LinqraftUsePrebuildExpression
- Added note about captures not supporting pre-built expressions
- Refactored ExpressionTreeBuilder to directly initialize expression fields (no lazy init)
- Removed GenerateNamedExpressionTreeInitialization and GenerateAnonymousExpressionTreeInitialization
- Expression trees now initialized at field declaration, eliminating null checks
- Updated SelectExprInfoNamed and SelectExprInfoExplicitDto to use new approach
- Added test for multiple DTO types to verify pre-built expressions work correctly
- All 6 tests passing

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Address final review feedback: readonly, indentation, remove test, add playground toggle

- Added 'readonly' keyword to static expression fields for immutability
- Fixed indentation: ensured proper line ending with AppendLine for multi-line expressions
- Deleted Linqraft.Tests.Configuration project as requested
- Removed project reference from Linqraft.slnx
- Added toggle for LinqraftUsePrebuildExpression in playground Settings section
- All tests passing (130/130)

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* revert: reset Linqraft.Tests.Configuration

* Fix indentation in BuildExprCodeSnippets for static fields

* Add static fields generation to expression code snippets

* formatt

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
Co-authored-by: Arika Ishinami <delete0093@gmail.com>
(cherry picked from commit 1761753)
@arika0093 arika0093 mentioned this pull request Dec 10, 2025
arika0093 added a commit that referenced this pull request Dec 10, 2025
* Fix: Remove parent class nesting from implicit DTOs in hash namespaces (#219)

* Initial plan

* Add test for issue: implicit DTOs should not be nested in parent class when using hash namespace

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Fix: Implicit DTOs should not be nested in parent class when using hash namespace

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
(cherry picked from commit dd2d380)

* Fix nested SelectExpr inconsistency between playground and source generator (#221)

* Initial plan

* Add shared IsNestedInsideAnotherSelectExpr helper and use in playground and source generator

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Add comprehensive tests for nested SelectExpr consistency fix

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Remove tests for nested SelectExpr type verification

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
Co-authored-by: Arika Ishinami <delete0093@gmail.com>
(cherry picked from commit a25737e)

* docs: Add IntroductionSection component and improve accessibility (#223)

* feat: add IntroductionSection component for query-based DTO generation

* fix: add translate attribute to improve accessibility in playground components

* refactor: remove custom animation definitions from tailwind.css

(cherry picked from commit 2a039c0)

* Fix nested SelectExpr code generation: parent class qualification, array types, and comment verbosity (#222)

* Initial plan

* Initial analysis of nested SelectExpr issues

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Fix Issues 1 and 3 for nested SelectExpr - Issue 2 still in progress

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Fix Issue 2 - array property types now correctly include [] suffix

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Refactor array type detection into helper method per code review

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Address PR review comments: rename test file, remove qualifiers with partial declarations, improve comments, extract method

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Clarify that partial class declarations are required for nested DTO generation

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
(cherry picked from commit a163791)

* docs: separate README contents to other files (#224)

(cherry picked from commit 29b0301)

* Fix: set default value of settingsExpanded to false in Sidebar component

(cherry picked from commit a34d686)

* docs: add comprehensive documentation for Nested SelectExpr feature

(cherry picked from commit 97439c9)

* Revert "docs: add comprehensive documentation for Nested SelectExpr feature"

This reverts commit 97439c9.

(cherry picked from commit 755698c)

* docs: add Nested SelectExpr documentation for reusable DTOs (#225)

* docs: add Nested SelectExpr documentation for reusable DTOs

* docs: update Nested SelectExpr documentation with important notes and usage requirements

* upd

* Fix GitHub Issue link in nested-selectexpr.md

(cherry picked from commit 64b9787)

* fix: NestedSelectExprTest and update documentation (#229)

* Fix: update Issue207_NestedSelectExprTest to support partial classes and remove .NET 9 specific warnings

* Fix: update documentation for Nested SelectExpr to clarify beta status and remove .NET 9+ recommendation

(cherry picked from commit 1aa5ec7)

* Document explicit class naming for nested DTOs

Added section on explicit class naming in nested DTOs.

(cherry picked from commit 1ddc079)

* Enhance library comparison with GitHub stars

Updated the library comparison table to include GitHub repository star counts for each library.

(cherry picked from commit d875f80)

* Update Docs link to point to library directory

(cherry picked from commit 59498e4)

* Refactor Order example to use records and facets

Updated the example to use records and facets for Order and OrderChild.

(cherry picked from commit c66f8b8)

* Add pre-built expression tree caching for IQueryable operations (#234)

* Initial plan

* Add pre-built expression tree configuration and implementation

- Added LinqraftUsePrebuildExpression configuration option (default: false)
- Created ExpressionTreeBuilder helper class for generating cached expression fields
- Updated SelectExprInfoAnonymous to use pre-built expressions when enabled
- Updated SelectExprInfoNamed to use pre-built expressions when enabled
- Updated SelectExprInfoExplicitDto to use pre-built expressions when enabled
- Pre-built expressions only apply to IQueryable (not IEnumerable)
- Pre-built expressions are disabled when captures are used

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Refactor static field generation to class level

- Moved static field generation from method body to class level
- Added GenerateStaticFields() virtual method to SelectExprInfo
- Updated SelectExprGroups to collect and pass static fields
- Updated GenerateSourceCodeSnippets to output static fields before methods
- Fixed null reference warning in SelectExprGroups

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Complete pre-built expression tree implementation

- Fixed CompilerVisibleProperty list to include LinqraftUsePrebuildExpression
- Anonymous types cannot use pre-built expressions (result type is compiler-generated)
- Pre-built expressions only work for named/predefined/explicit DTO types
- Added comprehensive tests for IQueryable with different DTO patterns
- All tests passing with pre-built expressions enabled

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Add LinqraftUsePrebuildExpression to all CompilerVisibleProperty lists

- Updated examples/Directory.Build.props with new configuration property
- Fixed playground/Services/CodeGenerationService.cs to use updated API signature
- All projects now support the new LinqraftUsePrebuildExpression configuration

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Add LinqraftUsePrebuildExpression property to project files

* Fix code generation issues per review feedback

- Use 'var' instead of explicit type in expression initialization (line 93)
- Remove unnecessary '!' null-forgiving operator when fieldName is not null
- Fix indentation of generated multi-line lambda expressions
- Use explicit Expression<> type instead of 'as' operator (lambdas cannot use 'as')

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Refactor to use direct expression initialization per review feedback

- Updated documentation in global-properties.md for LinqraftUsePrebuildExpression
- Added note about captures not supporting pre-built expressions
- Refactored ExpressionTreeBuilder to directly initialize expression fields (no lazy init)
- Removed GenerateNamedExpressionTreeInitialization and GenerateAnonymousExpressionTreeInitialization
- Expression trees now initialized at field declaration, eliminating null checks
- Updated SelectExprInfoNamed and SelectExprInfoExplicitDto to use new approach
- Added test for multiple DTO types to verify pre-built expressions work correctly
- All 6 tests passing

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Address final review feedback: readonly, indentation, remove test, add playground toggle

- Added 'readonly' keyword to static expression fields for immutability
- Fixed indentation: ensured proper line ending with AppendLine for multi-line expressions
- Deleted Linqraft.Tests.Configuration project as requested
- Removed project reference from Linqraft.slnx
- Added toggle for LinqraftUsePrebuildExpression in playground Settings section
- All tests passing (130/130)

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* revert: reset Linqraft.Tests.Configuration

* Fix indentation in BuildExprCodeSnippets for static fields

* Add static fields generation to expression code snippets

* formatt

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
Co-authored-by: Arika Ishinami <delete0093@gmail.com>
(cherry picked from commit 1761753)

* chore(deps): bump stefanzweifel/git-auto-commit-action from 4 to 7 (#236)

Bumps [stefanzweifel/git-auto-commit-action](https://github.com/stefanzweifel/git-auto-commit-action) from 4 to 7.
- [Release notes](https://github.com/stefanzweifel/git-auto-commit-action/releases)
- [Changelog](https://github.com/stefanzweifel/git-auto-commit-action/blob/master/CHANGELOG.md)
- [Commits](stefanzweifel/git-auto-commit-action@v4...v7)

---
updated-dependencies:
- dependency-name: stefanzweifel/git-auto-commit-action
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 107f2d2)

* Bump AutoMapper from 15.1.0 to 16.0.0 (#237)

---
updated-dependencies:
- dependency-name: AutoMapper
  dependency-version: 16.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 623b9fa)

* feat: optimize DTO generation and performance documentation (#235)

* Refactor GenerateDtoClasses method for improved readability and performance

* Add caching for pre-built expressions in SelectExprInfoNamed

* Refactor nullable access conversion to simplify default value handling

* Update performance documentation to clarify benchmarks and improve readability

* Update README to simplify performance and FAQ sections

* Fix nullable type handling in GetDefaultValueForType method

(cherry picked from commit 54005a1)

* formatted

(cherry picked from commit 11122cb)

* chore: update commit message format for csharpier workflow

(cherry picked from commit 735eb9f)

* playground: enable ScrollBeyondLastLine and update StickyScroll options in EditorPane and PreviewPane

(cherry picked from commit 9bc3057)

* Deduplicate DTO class definitions globally across all generated files (#240)

* Initial plan

* Fix duplicate ChildDto generation for same-shaped nested DTOs in Select expressions

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Improve code comments based on review feedback

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Fix duplicate DTO class definitions by deduplicating at generation point

Reverted changes to DtoProperty.cs and implemented deduplication in
GenerateSourceCodeSnippets.BuildDtoCodeSnippetsGroupedByNamespace instead.
This ensures DTOs with the same FullName (namespace + class name) are only
generated once, even when used across multiple SelectExpr calls.

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Implement global DTO deduplication across all files

- Collect all DTOs from all SelectExpr groups
- Deduplicate globally by FullName before generation
- Generate all DTOs in a single shared GeneratedDtos.g.cs file
- Each expression group file now only contains expression methods
- This ensures DTOs are not duplicated even when used across different files

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

* Refactor DTO generation based on code review feedback

- Moved global DTO deduplication logic to GenerateSourceCodeSnippets.BuildGlobalDtoCodeSnippet
- Separated SelectExprGroups.GenerateCode into two methods: GenerateCode and GenerateCodeWithoutDtos
- Made GenerateCommentHeaderPart and GenerateHeaderFlagsPart public for cross-namespace use
- Renamed test files to Issue239_* pattern for clarity
- Updated playground CodeGenerationService to use new global DTO deduplication
- Fixed null reference warning in playground service

Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
(cherry picked from commit 16b287e)

* refactor: DTO handling and improve code clarity (#216)

* refactor: improve code structure and add documentation for auto-generated DTO attribute

* refactor: rename ExportAll method to ExportAllConstantSnippets for clarity

* refactor: replace hardcoded DTO attributes with a dedicated method for better maintainability

* refactor: add EditorBrowsable attribute to internal DTO attributes for better visibility control

(cherry picked from commit ae2ba5f)

* fix

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: arika0093 <4524647+arika0093@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

proposal: Pre-build Expression Trees to improve performance

2 participants