Quarry.Analyzers.CodeFixes
0.2.1
dotnet add package Quarry.Analyzers.CodeFixes --version 0.2.1
NuGet\Install-Package Quarry.Analyzers.CodeFixes -Version 0.2.1
<PackageReference Include="Quarry.Analyzers.CodeFixes" Version="0.2.1" />
<PackageVersion Include="Quarry.Analyzers.CodeFixes" Version="0.2.1" />
<PackageReference Include="Quarry.Analyzers.CodeFixes" />
paket add Quarry.Analyzers.CodeFixes --version 0.2.1
#r "nuget: Quarry.Analyzers.CodeFixes, 0.2.1"
#:package Quarry.Analyzers.CodeFixes@0.2.1
#addin nuget:?package=Quarry.Analyzers.CodeFixes&version=0.2.1
#tool nuget:?package=Quarry.Analyzers.CodeFixes&version=0.2.1
Quarry
Type-safe SQL builder for .NET 10. Source generators + C# 12 interceptors emit all SQL at compile time. AOT compatible. Structured logging via Logsmith.
Quarry.Analyzers.CodeFixes
Code fix providers for Quarry analyzer diagnostics. Adds IDE lightbulb actions that automatically rewrite flagged query patterns.
Packages
| Name | NuGet | Description |
|---|---|---|
Quarry |
Runtime types: builders, schema DSL, dialects, executors. | |
Quarry.Generator |
Roslyn incremental source generator + interceptor emitter. | |
Quarry.Analyzers |
Compile-time SQL query analysis rules (QRA series) with code fixes. | |
Quarry.Analyzers.CodeFixes |
Code fix providers for QRA diagnostics. | |
Quarry.Tool |
CLI tool for migrations and database scaffolding (quarry command). |
Installation
<PackageReference Include="Quarry.Analyzers" Version="1.0.0"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false" />
<PackageReference Include="Quarry.Analyzers.CodeFixes" Version="1.0.0"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false" />
Both packages are required. Quarry.Analyzers reports diagnostics; Quarry.Analyzers.CodeFixes provides the IDE lightbulb fixes that act on them.
Available Code Fixes
Three diagnostics currently have automatic code fixes:
| Diagnostic | Fix Title | Transformation |
|---|---|---|
| QRA101 | Replace Count() comparison with Any() | Rewrites Count() > 0 to Any(), Count() == 0 to !Any(). Handles async variants. |
| QRA102 | Replace single-value Contains with == | Rewrites new[] { x }.Contains(col) to col == x. |
| QRA201 | Remove unused join | Removes the .Join(...) call from the query chain, preserving the receiver. |
All three support Fix All in Document / Project / Solution via the IDE lightbulb menu.
All Analyzer Rules (QRA Series)
The full Quarry.Analyzers rule set is listed below. Rules marked with a code fix have automatic IDE rewrites provided by this package.
QRA1xx — Simplification
| ID | Title | Severity | Code Fix | Description |
|---|---|---|---|---|
| QRA101 | Count compared to zero | Info | Yes | Count() > 0 or Count() == 0 can be replaced with Any(). |
| QRA102 | Single-value IN clause | Info | Yes | IN (@p0) with one value simplifies to =. |
| QRA103 | Tautological condition | Info | Always-true conditions like 1 = 1 or col = col. |
|
| QRA104 | Contradictory condition | Info | Always-false conditions like x > 5 AND x < 3. |
|
| QRA105 | Redundant condition | Info | A condition subsumed by a stronger one (e.g., x > 5 AND x > 3). |
|
| QRA106 | Nullable without null check | Info | Nullable column compared with == without IS NULL / IS NOT NULL handling. |
QRA2xx — Wasted Work
| ID | Title | Severity | Code Fix | Description |
|---|---|---|---|---|
| QRA201 | Unused join | Warning | Yes | Joined table not referenced in SELECT, WHERE, or ORDER BY. |
| QRA202 | Wide table SELECT * | Info | Full-entity projection on a table exceeding the column threshold. | |
| QRA203 | ORDER BY without LIMIT | Info | Sorting without pagination on an unbounded result set. | |
| QRA204 | Duplicate projection column | Info | Same column projected multiple times in SELECT. | |
| QRA205 | Cartesian product | Warning | JOIN with missing or trivial (1 = 1) ON condition. |
QRA3xx — Performance
| ID | Title | Severity | Code Fix | Description |
|---|---|---|---|---|
| QRA301 | Leading wildcard LIKE | Info | Contains() becomes LIKE '%...%', preventing index usage. |
|
| QRA302 | Function on column in WHERE | Info | LOWER(), UPPER(), SUBSTRING(), etc. on a column prevents index usage. |
|
| QRA303 | OR across different columns | Info | col1 = x OR col2 = y prevents single-index scan. |
|
| QRA304 | WHERE on non-indexed column | Info | Filtering on a column without a declared index. |
QRA4xx — Patterns
| ID | Title | Severity | Code Fix | Description |
|---|---|---|---|---|
| QRA401 | Query inside loop | Warning | Query execution inside for/foreach/while or LINQ .Select() (N+1 risk). |
|
| QRA402 | Multiple queries on same table | Info | Multiple independent queries on the same entity in one method. |
QRA5xx — Dialect
| ID | Title | Severity | Code Fix | Description |
|---|---|---|---|---|
| QRA501 | Dialect-specific optimization | Info | Dialect has a better alternative (e.g., PostgreSQL ILIKE instead of LOWER() + LIKE). |
|
| QRA502 | Suboptimal for dialect | Warning | Feature unsupported or invalid for the target dialect (e.g., SQLite RIGHT JOIN, SQL Server OFFSET without ORDER BY). |
Examples
QRA101 — Count to Any
// Before (flagged by QRA101)
var hasOrders = await db.Users
.Where(u => u.Orders.Count() > 0)
.ExecuteFetchAllAsync();
// After fix applied
var hasOrders = await db.Users
.Where(u => u.Orders.Any())
.ExecuteFetchAllAsync();
QRA102 — Single-value IN to Equals
// Before (flagged by QRA102)
db.Users().Where(u => new[] { 42 }.Contains(u.UserId));
// After fix applied
db.Users().Where(u => u.UserId == 42);
QRA201 — Remove Unused Join
// Before (flagged by QRA201)
db.Users().Join<Order>((u, o) => u.UserId == o.UserId.Id)
.Select((u, o) => u.UserName); // 'o' never used
// After fix applied
db.Users()
.Select(u => u.UserName);
QRA401 — Query Inside Loop (N+1)
// Flagged by QRA401
foreach (var id in userIds)
{
var user = await db.Users
.Where(u => u.Id == id)
.ExecuteFetchFirstAsync();
}
// Preferred: batch query
var users = await db.Users
.Where(u => userIds.Contains(u.Id))
.ExecuteFetchAllAsync();
QRA205 — Cartesian Product
// Flagged by QRA205 — missing ON condition
db.Users().Join<Order>()
.Select((u, o) => new { u.Name, o.Total });
// Fixed: add join condition
db.Users().Join<Order>((u, o) => u.Id == o.UserId)
.Select((u, o) => new { u.Name, o.Total });
Configuration
Severity overrides via .editorconfig
# Disable a specific rule
dotnet_diagnostic.QRA301.severity = none
# Escalate to warning
dotnet_diagnostic.QRA103.severity = warning
Rule-specific settings
# QRA202: column threshold for wide-table detection (default: 10)
quarry_analyzers.wide_table_column_count = 15
Inline suppression
#pragma warning disable QRA301
var results = db.Users().Where(u => u.Name.Contains(term));
#pragma warning restore QRA301
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Quarry.Analyzers (>= 0.2.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.