Avoid List allocation for PostProcessingAction.#501
Merged
Conversation
There was a problem hiding this comment.
Pull Request Overview
This PR introduces an AsList extension to avoid unnecessary list allocations when PostProcessingAction returns an existing List<T>, updates null checks to use is null, and applies AsList across various evaluators and repository methods.
- Added
CollectionExtensions.AsListto return the source list if already aList<T>, otherwise callToList(). - Replaced
== nullwithis nullforPostProcessingActionchecks. - Updated EF Core and EF6
ListAsyncandDbSetExtensionsmethods to useAsListinstead of always callingToList().
Reviewed Changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| InMemorySpecificationEvaluator.cs | Switched null checks to is null for PostProcessingAction. |
| CollectionExtensions.cs | Added AsList extension to reuse existing List<T>. |
| RepositoryBaseOfT.cs (EF Core) | Updated to use AsList after post-processing instead of ToList(). |
| DbSetExtensions.cs (EF Core) | Updated to use AsList when applying PostProcessingAction. |
| ContextFactoryRepositoryBaseOfT.cs | Updated to use AsList after post-processing in factory repo. |
| RepositoryBaseOfT.cs (EF6) | Updated to use AsList after post-processing instead of ToList(). |
| DbSetExtensions.cs (EF6) | Updated to use AsList when applying PostProcessingAction. |
Comments suppressed due to low confidence (3)
src/Ardalis.Specification/CollectionExtensions.cs:5
- [nitpick] Add an XML doc comment for
AsList<T>to explain its behavior and intent for future maintainers.
public static List<T> AsList<T>(this IEnumerable<T> source)
src/Ardalis.Specification/CollectionExtensions.cs:7
- Add unit tests for
AsListto cover both scenarios: whensourceis already aList<T>and when it is not, verifying that the returned instance and contents are correct.
if (source is List<T> list)
src/Ardalis.Specification/CollectionExtensions.cs:12
- The call to
ToList()requires theSystem.Linqnamespace; addusing System.Linq;at the top of this file to ensure it compiles.
return source.ToList();
This was referenced Aug 20, 2025
Closed
Closed
Closed
Closed
gritcsenko
added a commit
to gritcsenko/HomeInventory
that referenced
this pull request
Aug 24, 2025
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [Ardalis.Specification](https://redirect.github.com/ardalis/specification) | `9.2.0` -> `9.3.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>ardalis/specification (Ardalis.Specification)</summary> ### [`v9.3.0`](https://redirect.github.com/ardalis/Specification/releases/tag/v9.3.0) #### What's Changed - Avoid List allocation for PostProcessingAction. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#501](https://redirect.github.com/ardalis/Specification/pull/501) - Redefine WithProjectionOf as an extension to Specification instead of ISpecification by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#517](https://redirect.github.com/ardalis/Specification/pull/517) - Rename TagWithEvaluator to QueryTagEvaluator. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#512](https://redirect.github.com/ardalis/Specification/pull/512) - OneOrMany implementation by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#507](https://redirect.github.com/ardalis/Specification/pull/507) - Refactor the state of where expressions as OneOrMany. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#508](https://redirect.github.com/ardalis/Specification/pull/508) - Refactor the state of order expressions as OneOrMany. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#509](https://redirect.github.com/ardalis/Specification/pull/509) - Refactor the state of include expressions as OneOrMany. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#510](https://redirect.github.com/ardalis/Specification/pull/510) - Refactor the state of search expressions as OneOrMany. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#511](https://redirect.github.com/ardalis/Specification/pull/511) - Consolidate OneOrMany implementation and its usage. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#513](https://redirect.github.com/ardalis/Specification/pull/513) - Add a fallback to LINQ for search evaluators/validator in case of custom user specifications. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#514](https://redirect.github.com/ardalis/Specification/pull/514) - Update dependencies. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#526](https://redirect.github.com/ardalis/Specification/pull/526) - Use opencover format for coverage reports. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#503](https://redirect.github.com/ardalis/Specification/pull/503) - Added Full Build workflow that publishes coverage reports. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#504](https://redirect.github.com/ardalis/Specification/pull/504) - Add benchmarks project. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#505](https://redirect.github.com/ardalis/Specification/pull/505) - Cleanup by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#518](https://redirect.github.com/ardalis/Specification/pull/518) - Add new test fixtures for EF6 provider. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#519](https://redirect.github.com/ardalis/Specification/pull/519) - Add tests for EF6 evaluators. by [@​fiseni](https://redirect.github.com/fiseni) in [ardalis/Specification#520](https://redirect.github.com/ardalis/Specification/pull/520) **Full Changelog**: <ardalis/Specification@v9.2.0...v9.3.0> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/gritcsenko/HomeInventory). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS44MS4yIiwidXBkYXRlZEluVmVyIjoiNDEuODIuNyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
This was referenced Jun 18, 2026
Open
This was referenced Jun 28, 2026
This was referenced Jul 6, 2026
Open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Added
AsListextension. If theIEnumerablesource is aList, we return the list, otherwise, we create a new one.The
PostProcessingActionis aFunc<IEnumerable<T>, IEnumerable<T>>delegate. However, users do not always filter the collection; they may just iterate over it and update items. In that case, if the delegate output isList, we may directly return it instead of allocating a new one.