chore(sonar): mechanical src/ cleanups — AsSpan, drop ContainsKey guard, simplify GetQuery (CA1846, CA1853, S2219)

- `SqlParseException.cs:90` (CA1846): `sql.Substring(0, 197)` →
  `sql.AsSpan(0, 197)` in the truncated-SQL diagnostic message. Avoids
  an allocation in an already cold exception path.

- `Snowflake/QueryBreakdown.cs:103` (CA1853): drop the redundant
  `Parameters.ContainsKey(...)` guard around `Parameters.Remove(...)`.
  `Dictionary<TKey,TValue>.Remove` is a no-op if the key is absent, so
  the guard only doubled the work and computed the key string twice.

- `LinqQueryBreakdown.cs:194` (S2219): collapse the now-stub
  `GetQuery<T>()` (every branch returned `GetEmptyQueryable<T>()` after
  the S1168 cleanup) to a single expression-bodied member. Updates the
  XML doc to describe the actual current behavior.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Thom Lamb
2026-05-27 15:05:19 -05:00
co-authored by Claude Opus 4.7
parent cbe891dc0b
commit 1bd6deec83
3 changed files with 7 additions and 30 deletions
@@ -185,33 +185,13 @@ public class LinqQueryBreakdown : QueryBreakdown
/// Gets a LINQ to SQL query of the specified type based on this breakdown.
/// </summary>
/// <typeparam name="T">The entity type for the query.</typeparam>
/// <returns>An IQueryable of the specified type reconstructed from the breakdown; an empty queryable if the type doesn't match the original entity type or the original data source isn't available.</returns>
/// <returns>An empty queryable. Breakdown analysis is one-way; reconstruction requires the original provider, which is not preserved.</returns>
/// <remarks>
/// This method attempts to reconstruct a LINQ query from the analyzed components (WHERE, ORDER BY, etc.).
/// If a data source (IQueryable) is available in the breakdown's OriginalExpression, it will be used.
/// Otherwise, returns an empty queryable — breakdown analysis is one-way; reconstruction requires the original provider.
/// Always returns an empty queryable today. A future version may reconstruct the LINQ query from
/// <see cref="OriginalExpression"/> when the provider is available; until then callers receive an
/// empty result rather than a null reference.
/// </remarks>
public override IQueryable<T> GetQuery<T>() where T : class
{
if (OriginalExpression == null)
{
return GetEmptyQueryable<T>();
}
try
{
if (OriginalExpression is Expression && EntityType == typeof(T))
{
return GetEmptyQueryable<T>();
}
return GetEmptyQueryable<T>();
}
catch
{
return GetEmptyQueryable<T>();
}
}
public override IQueryable<T> GetQuery<T>() where T : class => GetEmptyQueryable<T>();
/// <summary>
/// Get and empty queryable of T
@@ -100,10 +100,7 @@ public class QueryBreakdown : SqlServerQueryBreakdown
base.AddParameter(colonName.TrimStart(':', '@'), value);
// Add both formats to dictionary for compatibility
if (Parameters.ContainsKey($"@{colonName.TrimStart(':', '@')}"))
{
Parameters.Remove($"@{colonName.TrimStart(':', '@')}");
}
Parameters.Remove($"@{colonName.TrimStart(':', '@')}");
Parameters[colonName] = value;
Parameters[atName] = value;
}
@@ -87,7 +87,7 @@ public class SqlParseException : Exception
}
else
{
sb.AppendLine($"SQL (truncated): {sql.Substring(0, 197)}...");
sb.AppendLine($"SQL (truncated): {sql.AsSpan(0, 197)}...");
}
return sb.ToString();