Risoluzione dei problemi

Le informazioni seguenti espongono alcuni problemi che possono verificarsi nelle applicazioni LINQ to SQL e forniscono suggerimenti per evitare o ridurre in altro modo l'effetto di questi problemi.

Altri problemi vengono risolti nelle domande frequenti.

Operatori di query standard non supportati

LINQ to SQL non supporta tutti i metodi dell'operatore di query standard ,ad esempio ElementAt. Di conseguenza, durante la compilazione dei progetti possono comunque verificarsi errori di runtime. Per altre informazioni, vedere Conversione operatore query standard.

Problemi di memoria

Se una query prevede una raccolta in memoria e LINQ to SQL Table<TEntity>, la query potrebbe essere eseguita in memoria, a seconda dell'ordine in cui vengono specificate le due raccolte. Se la query deve essere eseguita in memoria, sarà necessario recuperare i dati dalla tabella di database.

Questo approccio non è quindi consigliato poiché può comportare un utilizzo significativo della memoria e del processore. Tentare di evitare tali query multidominio.

Nomi file e SQLMetal

Per specificare un nome file di input, aggiungere il nome nella riga di comando come file di input. Non è possibile includere il nome file nella stringa di connessione mediante l'opzione /conn . Per altre informazioni, vedere SqlMetal.exe (strumento per la generazione del codice).

Progetti di librerie di classi

Il Object Relational Designer crea una stringa di connessione nel app.config file del progetto. Nei progetti di librerie di classi il file app.config non viene usato. LINQ to SQL usa la stringa di connessione fornita nei file in fase di progettazione. La modifica del valore in app.config non comporta la modifica del database al quale si connette l'applicazione.

Eliminazione a catena

LINQ to SQL non supporta né riconosce le operazioni di eliminazione a catena. Se si desidera eliminare una riga in una tabella contenente vincoli, è necessario effettuare una delle operazioni seguenti:

  • Impostare la regola ON DELETE CASCADE nel vincolo di chiave esterna del database.

  • Usare il codice personalizzato per eliminare prima gli oggetti figlio che impediscono l'eliminazione dell'oggetto padre.

In caso contrario, viene generata un'eccezione SqlException.

Per altre informazioni, vedere Procedura: Eliminare righe dal database.

Espressione che non può essere sottoposta a query

Se viene visualizzato l'errore "L'espressione [espressione] non può essere sottoposta a query. Probabilmente manca un riferimento a un assembly.", accertarsi che:

  • L'applicazione è destinata a .NET Compact Framework 3.5.

  • È presente un riferimento a System.Core.dll e System.Data.Linq.dll.

  • È disponibile una Imports direttiva (Visual Basic) o using (C#) per System.Linq e System.Data.Linq.

DuplicateKeyException

Durante il debug di un progetto di LINQ to SQL, è possibile attraversare le relazioni di un'entità. In questo modo questi elementi vengono inseriti nella cache e LINQ to SQL diventano consapevoli della loro presenza. Se si tenta quindi di eseguire Attach o InsertOnSubmit oppure un metodo simile che crea più righe con la stessa chiave, viene generata un'eccezione DuplicateKeyException.

Eccezioni di concatenazione di stringhe

La concatenazione su operandi di cui viene eseguito il mapping a [n]text e altri [n][var]char non è supportata. Viene generata un'eccezione per la concatenazione di stringhe di cui viene eseguito il mapping a due set di tipi diversi. Per altre informazioni, vedere Metodi System.String.

Come ignorare e accettare le eccezioni in SQL Server 2000

È necessario usare i membri di identità (IsPrimaryKey) quando si usa Take o Skip su un database SQL Server 2000. La query deve essere eseguita su una singola tabella, ovvero non un join, o deve essere un'operazione Distinct, Except, Intersect o Union e non deve includere un'operazione Concat. Per altre informazioni, vedere la sezione "SQL Server 2000 Support" in Standard Query Operator Translation.For more information, see the "SQL Server 2000 Support" in Standard Query Operator Translation.

Questo requisito non si applica a SQL Server 2005.

GroupBy InvalidOperationException

Questa eccezione viene generata quando un valore di colonna è null in una query GroupBy che esegue il raggruppamento in base a un'espressione boolean, ad esempio group x by (Phone==@phone). Poiché l'espressione è un booleanoggetto , la chiave viene dedotta come boolean, non nullableboolean. Quando il confronto tradotto produce un valore Null, viene effettuato un tentativo di assegnare un nullableboolean oggetto a e booleanviene generata l'eccezione.

Per evitare questa situazione, presupponendo che si desideri trattare i valori null come false, usare un approccio analogo al seguente:

GroupBy="(Phone != null) && (Phone=@Phone)"

Metodo parziale OnCreated()

Il metodo OnCreated() generato viene chiamato ogni volta che viene chiamato il costruttore dell'oggetto, incluso lo scenario in cui LINQ to SQL chiama il costruttore per creare una copia per i valori originali. Tenere conto di questo comportamento se si implementa il metodo OnCreated() nella classe parziale personalizzata.

Vedi anche