Condividi tramite


Risoluzione dei problemi (LINQ to SQL)

Nelle informazioni seguenti vengono illustrati alcuni problemi che è possibile incontrare nelle applicazioni LINQ to SQL e vengono forniti suggerimenti per evitare o altrimenti ridurre l'effetto di questi problemi.

Ulteriori problemi vengono esaminati in Domande frequenti (LINQ to SQL).

Operatori di query standard non supportati

LINQ to SQL non supporta tutti i metodi degli operatori di query standard, ad esempio ElementAt<TSource>. Di conseguenza, durante la compilazione dei progetti possono comunque verificarsi errori di runtime. Per ulteriori informazioni, vedere Conversione dell'operatore di query standard (LINQ to SQL).

Problemi di memoria

Se una query implica 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 ulteriori informazioni, vedere SqlMetal.exe (strumento per la generazione del codice).

Progetti di librerie di classi

La Object Relational Designer crea una stringa di connessione nel file app.config del progetto. Nei progetti di librerie di classi il file app.config non viene utilizzato. LINQ to SQL utilizza la stringa di connessione fornita nei file della 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 o non riconosce 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.

  • Utilizzare 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 ulteriori informazioni, vedere Procedura: eliminare righe dal database (LINQ to SQL).

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 possa essere utilizzata con .NET Compact Framework 3.5.

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

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

DuplicateKeyException

Nel corso del debug di un progetto LINQ to SQL, è possibile attraversare le relazioni di un'entità. In questo modo tali elementi vengono inseriti nella cache e LINQ to SQL ne rileva la 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 ulteriori informazioni, vedere Metodi System.String (LINQ to SQL).

Come ignorare e accettare le eccezioni in SQL Server 2000

È necessario utilizzare i membri di identità (IsPrimaryKey) quando si utilizza Take<TSource> o Skip<TSource> 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<TSource>. Per ulteriori informazioni, vedere la sezione "Supporto di SQL Server 2000" in Conversione dell'operatore di query standard (LINQ to SQL).

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 è boolean, si deduce che la chiave sia boolean, non nullable boolean. Quando il confronto convertito produce un valore null, viene effettuato un tentativo di assegnare un nullable boolean a un boolean e viene generata l'eccezione.

Per evitare questa situazione, presupponendo che si desideri trattare i valori null come false, utilizzare 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 dei valori originali. Tenere conto di questo comportamento se si implementa il metodo OnCreated() nella classe parziale personalizzata.

Vedere anche

Concetti

Domande frequenti (LINQ to SQL)

Altre risorse

Supporto per il debug (LINQ to SQL)