Add Business package linter with NoLoadInForeach rule #599
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.
Implements a code linter for Business packages to detect performance anti-patterns. Initial rule flags
Load()calls insideforeachloops, which cause N+1 query issues.Architecture
Roslyn-based linter following existing
ValidateStartAndEndMethodsCommandpattern:cmf build business lint <solution-path> [files...]Load()invocations withinForEachStatementSyntaxImplementation
NoLoadInForeach catches:
Outputs:
Extensibility
New rules require:
BaseLintRuleAnalyze(MethodDeclarationSyntax, ...)ServiceCollectionExtensionsRule enable/disable via
IsEnabledproperty. Configuration schema provided for future file-based config.Testing
6 unit tests cover: direct calls, chained calls, multiple violations, nested loops, and valid patterns outside loops.
Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
0t3vsblobprodcus362.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)1javsblobprodcus364.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)2zrvsblobprodcus388.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)37bvsblobprodcus311.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)4m6vsblobprodcus384.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)4zjvsblobprodcus390.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)51yvsblobprodcus36.vsblob.vsassets.iodotnet restore --no-cache(dns block)5dkvsblobprodcus355.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)h6tvsblobprodcus346.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)jd4vsblobprodcus366.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)kh4vsblobprodcus325.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)kxqvsblobprodcus376.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)l49vsblobprodcus358.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)mfjvsblobprodcus373.vsblob.vsassets.iodotnet build(dns block)p2ovsblobprodcus312.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)s8mvsblobprodcus38.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)se1vsblobprodcus349.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)uy6vsblobprodcus34.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)x3yvsblobprodcus370.vsblob.vsassets.iodotnet build(dns block)dotnet restore --no-cache(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.