Delen via


Problemen oplossen

De volgende informatie bevat enkele problemen die u kunt tegenkomen in uw LINQ to SQL-toepassingen en biedt suggesties om het effect van deze problemen te voorkomen of anderszins te verminderen.

Aanvullende problemen worden behandeld in Veelgestelde vragen.

Niet-ondersteunde standaardqueryoperators

LINQ to SQL biedt geen ondersteuning voor alle standaardqueryoperatormethoden (bijvoorbeeld ElementAt). Als gevolg hiervan kunnen gecompileerd projecten nog steeds runtimefouten veroorzaken. Zie Standard Query Operator Translation (Standard Query Operator Translation) voor meer informatie.

Geheugenproblemen

Als een query een in-memory verzameling en LINQ to SQL Table<TEntity>bevat, kan de query worden uitgevoerd in het geheugen, afhankelijk van de volgorde waarin de twee verzamelingen zijn opgegeven. Als de query in het geheugen moet worden uitgevoerd, moeten de gegevens uit de databasetabel worden opgehaald.

Deze aanpak is inefficiënt en kan leiden tot een aanzienlijk geheugen- en processorgebruik. Probeer dergelijke query's met meerdere domeinen te vermijden.

Bestandsnamen en SQLMetal

Als u een naam voor het invoerbestand wilt opgeven, voegt u de naam toe aan de opdrachtregel als het invoerbestand. Het opnemen van de bestandsnaam in de connection string (met behulp van de optie /conn) wordt niet ondersteund. Zie SqlMetal.exe (hulpprogramma voor het genereren van code) voor meer informatie.

Klassebibliotheekprojecten

De Object Relational Designer maakt een connection string in het app.config bestand van het project. In klassebibliotheekprojecten wordt het app.config bestand niet gebruikt. LINQ to SQL gebruikt de verbindingsreeks die is opgegeven in de ontwerptijdbestanden. Als u de waarde in app.config wijzigt, wordt de database waarmee uw toepassing verbinding maakt, niet gewijzigd.

Trapsgewijs verwijderen

LINQ to SQL biedt geen ondersteuning voor of herkent geen bewerkingen voor trapsgewijs verwijderen. Als u een rij in een tabel met beperkingen wilt verwijderen, moet u een van de volgende handelingen uitvoeren:

  • Stel de ON DELETE CASCADE regel in de beperking refererende sleutel in de database in.

  • Gebruik uw eigen code om eerst de onderliggende objecten te verwijderen die verhinderen dat het bovenliggende object wordt verwijderd.

Anders wordt er een SqlException uitzondering gegenereerd.

Zie Procedure: Rijen verwijderen uit de database voor meer informatie.

Expressie kan niet worden opgevraagd

Als u de 'Expressie [expressie] kan niet worden opgevraagd; Ontbreekt er een assembly-verwijzing?', controleert u het volgende:

  • Uw toepassing is gericht op .NET Compact Framework 3.5.

  • U hebt een verwijzing naar System.Core.dll en System.Data.Linq.dll.

  • U hebt een Imports (Visual Basic) of using (C#) -instructie voor System.Linq en System.Data.Linq.

DuplicateKeyException

Tijdens het opsporen van fouten in een LINQ to SQL-project, kunt u de relaties van een entiteit doorkruisen. Als u dit doet, worden deze items in de cache geplaatst en wordt LINQ to SQL zich bewust van hun aanwezigheid. Als u vervolgens probeert uit te voeren Attach of InsertOnSubmit een vergelijkbare methode die meerdere rijen met dezelfde sleutel produceert, wordt een DuplicateKeyException gegenereerd.

Uitzonderingen voor samenvoeging van tekenreeksen

Samenvoeging van operanden die zijn toegewezen aan [n]text en andere [n][var]char wordt niet ondersteund. Er wordt een uitzondering gegenereerd voor het samenvoegen van tekenreeksen die zijn toegewezen aan de twee verschillende sets typen. Zie System.String Methods (System.String-methoden) voor meer informatie.

Uitzonderingen overslaan en maken in SQL Server 2000

U moet identiteitsleden (IsPrimaryKey) gebruiken wanneer u Take of Skip gebruikt voor een SQL Server 2000-database. De query moet betrekking hebben op één tabel (dus geen join) of een Distinctbewerking , Except, Intersectof Union en mag geen bewerking bevatten Concat . Zie de sectie 'SQL Server 2000 Support' in Standard Query Operator Translation (Standard Query Operator Translation) voor meer informatie.

Dit geldt niet voor SQL Server 2005.

GroupBy InvalidOperationException

Deze uitzondering wordt gegenereerd wanneer een kolomwaarde null is in een GroupBy query die wordt gegroepeerd op basis van een boolean expressie, zoals group x by (Phone==@phone). Omdat de expressie een booleanis, wordt de sleutel afgeleid als boolean, niet nullableboolean. Wanneer de vertaalde vergelijking een null produceert, wordt een poging gedaan om een nullableboolean toe te wijzen aan een booleanen wordt de uitzondering gegenereerd.

Als u deze situatie wilt voorkomen (ervan uitgaande dat u null-waarden als onwaar wilt behandelen), gebruikt u een methode zoals de volgende:

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

Gedeeltelijke methode OnCreated()

De gegenereerde methode OnCreated() wordt aangeroepen telkens wanneer de objectconstructor wordt aangeroepen, inclusief het scenario waarin LINQ to SQL de constructor aanroept om een kopie te maken voor de oorspronkelijke waarden. Neem dit gedrag in aanmerking als u de OnCreated() methode in uw eigen gedeeltelijke klasse implementeert.

Zie ook