Skip to content

Avoid List allocation for PostProcessingAction.#501

Merged
fiseni merged 1 commit into
mainfrom
fiseni/aslist-extension
Jun 9, 2025
Merged

Avoid List allocation for PostProcessingAction.#501
fiseni merged 1 commit into
mainfrom
fiseni/aslist-extension

Conversation

@fiseni

@fiseni fiseni commented Jun 9, 2025

Copy link
Copy Markdown
Collaborator

Added AsList extension. If the IEnumerable source is a List, we return the list, otherwise, we create a new one.

The PostProcessingAction is a Func<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 is List, we may directly return it instead of allocating a new one.

@fiseni fiseni requested a review from Copilot June 9, 2025 09:39

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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.AsList to return the source list if already a List<T>, otherwise call ToList().
  • Replaced == null with is null for PostProcessingAction checks.
  • Updated EF Core and EF6 ListAsync and DbSetExtensions methods to use AsList instead of always calling ToList().

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 AsList to cover both scenarios: when source is already a List<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 the System.Linq namespace; add using System.Linq; at the top of this file to ensure it compiles.
return source.ToList();

Comment thread src/Ardalis.Specification.EntityFrameworkCore/RepositoryBaseOfT.cs
@fiseni fiseni merged commit 5285862 into main Jun 9, 2025
1 check passed
@fiseni fiseni deleted the fiseni/aslist-extension branch June 9, 2025 09:49
@fiseni fiseni mentioned this pull request Jul 17, 2025
21 tasks
This was referenced Aug 20, 2025
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` |
[![age](https://developer.mend.io/api/mc/badges/age/nuget/Ardalis.Specification/9.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Ardalis.Specification/9.2.0/9.3.0?slim=true)](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
[@&#8203;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 [@&#8203;fiseni](https://redirect.github.com/fiseni)
in
[ardalis/Specification#517](https://redirect.github.com/ardalis/Specification/pull/517)
- Rename TagWithEvaluator to QueryTagEvaluator. by
[@&#8203;fiseni](https://redirect.github.com/fiseni) in
[ardalis/Specification#512](https://redirect.github.com/ardalis/Specification/pull/512)
- OneOrMany implementation by
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;fiseni](https://redirect.github.com/fiseni) in
[ardalis/Specification#514](https://redirect.github.com/ardalis/Specification/pull/514)
- Update dependencies. by
[@&#8203;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
[@&#8203;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
[@&#8203;fiseni](https://redirect.github.com/fiseni) in
[ardalis/Specification#504](https://redirect.github.com/ardalis/Specification/pull/504)
- Add benchmarks project. by
[@&#8203;fiseni](https://redirect.github.com/fiseni) in
[ardalis/Specification#505](https://redirect.github.com/ardalis/Specification/pull/505)
- Cleanup by [@&#8203;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
[@&#8203;fiseni](https://redirect.github.com/fiseni) in
[ardalis/Specification#519](https://redirect.github.com/ardalis/Specification/pull/519)
- Add tests for EF6 evaluators. by
[@&#8203;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==-->
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.

2 participants