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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Quarry.Analyzers.CodeFixes" Version="0.2.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Quarry.Analyzers.CodeFixes" Version="0.2.1" />
                    
Directory.Packages.props
<PackageReference Include="Quarry.Analyzers.CodeFixes" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Quarry.Analyzers.CodeFixes --version 0.2.1
                    
#r "nuget: Quarry.Analyzers.CodeFixes, 0.2.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Quarry.Analyzers.CodeFixes@0.2.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Quarry.Analyzers.CodeFixes&version=0.2.1
                    
Install as a Cake Addin
#tool nuget:?package=Quarry.Analyzers.CodeFixes&version=0.2.1
                    
Install as a Cake Tool

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 Quarry Runtime types: builders, schema DSL, dialects, executors.
Quarry.Generator Quarry.Generator Roslyn incremental source generator + interceptor emitter.
Quarry.Analyzers Quarry.Analyzers Compile-time SQL query analysis rules (QRA series) with code fixes.
Quarry.Analyzers.CodeFixes Quarry.Analyzers.CodeFixes Code fix providers for QRA diagnostics.
Quarry.Tool 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.2.1 62 3/29/2026
0.2.0 62 3/29/2026
0.1.0 95 3/13/2026