CA1828: Non usare CountAsync/LongCountAsync quando è possibile usare AnyAsync

Proprietà valore
ID regola CA1828
Title Non usare CountAsync/LongCountAsync se è possibile usare AnyAsync
Categoria Prestazioni
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

Il CountAsync metodo o LongCountAsync è stato usato in cui il AnyAsync metodo sarebbe più efficiente.

Descrizione regola

Questa regola contrassegna le chiamate al CountAsync metodo LINQ e LongCountAsync utilizzate per verificare se la raccolta ha almeno un elemento. Queste chiamate al metodo richiedono l'enumerazione dell'intera raccolta per calcolare il conteggio. Lo stesso controllo è più veloce con il AnyAsync metodo perché evita di enumerare la raccolta.

Come correggere le violazioni

Per correggere una violazione, sostituire la chiamata al CountAsync metodo o LongCountAsync con il AnyAsync metodo . Ad esempio, i due frammenti di codice seguenti mostrano una violazione della regola e come risolverli:

using System.Linq;
using System.Threading.Tasks;
using static Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions;

class C
{
    public async Task<string> M1Async(IQueryable<string> list)
        => await list.CountAsync() != 0 ? "Not empty" : "Empty";

    public async Task<string> M2Async(IQueryable<string> list)
        => await list.LongCountAsync() > 0 ? "Not empty" : "Empty";
}
using System.Linq;
using System.Threading.Tasks;
using static Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions;

class C
{
    public async Task<string> M1Async(IQueryable<string> list)
        => await list.AnyAsync() ? "Not empty" : "Empty";

    public async Task<string> M2Async(IQueryable<string> list)
        => await list.AnyAsync() ? "Not empty" : "Empty";
}

Suggerimento

Una correzione del codice è disponibile per questa regola in Visual Studio. Per usarlo, posizionare il cursore sulla violazione e premere CTRL+. (punto). Scegliere Non usare CountAsync() o LongCountAsync() quando è possibile usare AnyAsync() dall'elenco di opzioni presentate.

Code fix for CA1828 - Do not use CountAsync() or LongCountAsync() when AnyAsync() can be used

Quando eliminare gli avvisi

È possibile eliminare una violazione di questa regola se non si è interessati all'impatto sulle prestazioni dall'enumerazione raccolta non necessaria per calcolare il conteggio.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

#pragma warning disable CA1828
// The code that's violating the rule is on this line.
#pragma warning restore CA1828

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

[*.{cs,vb}]
dotnet_diagnostic.CA1828.severity = none

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedi anche