Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Abschnitt enthält Informationen zu bekannten Problemen mit LINQ to Entities-Abfragen.
Verweisen auf nicht skalare Variablen, die nicht unterstützt werden
Geschachtelte Abfragen können mit SQL Server 2000 fehlschlagen
LINQ-Abfragen, die nicht zwischengespeichert werden können
Ab .NET Framework 4.5 werden LINQ to Entities-Abfragen automatisch zwischengespeichert. LINQ to Entities-Abfragen, die den Enumerable.Contains Operator auf In-Memory-Sammlungen anwenden, werden jedoch nicht automatisch zwischengespeichert. Das Parametrisieren von In-Memory-Auflistungen in kompilierten LINQ-Abfragen ist ebenfalls nicht zulässig.
Verlorene Bestellinformationen
Das Projizieren von Spalten in einen anonymen Typ führt dazu, dass die Sortierungsinformationen in einigen Abfragen verloren gehen, die für eine SQL Server 2005-Datenbank ausgeführt werden, die auf eine Kompatibilitätsebene von "80" festgelegt ist. Dies tritt auf, wenn ein Spaltenname in der order-by-Liste mit einem Spaltennamen im Selektor übereinstimmt, wie im folgenden Beispiel gezeigt:
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
// Ordering information is lost when executed against a SQL Server 2005
// database running with a compatibility level of "80".
var results = context.Contacts.SelectMany(c => c.SalesOrderHeaders)
.OrderBy(c => c.SalesOrderDetails.Count)
.Select(c => new { c.SalesOrderDetails.Count });
foreach (var result in results)
Console.WriteLine(result.Count);
}
Using context As New AdventureWorksEntities()
' Ordering information is lost when executed against a SQL Server 2005
' database running with a compatibility level of "80".
Dim results = context.Contacts.SelectMany(Function(c) c.SalesOrderHeaders) _
.OrderBy(Function(c) c.SalesOrderDetails.Count) _
.Select(Function(c) New With {c.SalesOrderDetails.Count})
For Each result In results
Console.WriteLine(result.Count)
Next
End Using
Nicht signierte Ganze Zahlen werden nicht unterstützt
Das Angeben eines nicht signierten ganzzahligen Typs in einer LINQ to Entities-Abfrage wird nicht unterstützt, da das Entity Framework keine nicht signierten Ganzzahlen unterstützt. Wenn Sie eine nicht signierte ganze Zahl angeben, wird während der Abfrageausdruckübersetzung eine ArgumentException Ausnahme ausgelöst, wie im folgenden Beispiel gezeigt. In diesem Beispiel wird eine Bestellung mit der ID 48000 angefragt.
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
uint s = UInt32.Parse("48000");
IQueryable<SalesOrderDetail> query = from sale in context.SalesOrderDetails
where sale.SalesOrderID == s
select sale;
// NotSupportedException exception is thrown here.
try
{
foreach (SalesOrderDetail order in query)
Console.WriteLine("SalesOrderID: " + order.SalesOrderID);
}
catch (NotSupportedException ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
}
Using context As New AdventureWorksEntities()
Dim saleId As UInteger = UInt32.Parse("48000")
Dim query = _
From sale In context.SalesOrderDetails _
Where sale.SalesOrderID = saleId _
Select sale
Try
' NotSupportedException exception is thrown here.
For Each order As SalesOrderDetail In query
Console.WriteLine("SalesOrderID: " & order.SalesOrderID)
Next
Catch ex As NotSupportedException
Console.WriteLine("Exception: " + ex.Message)
End Try
End Using
Typkonvertierungsfehler
Wenn Sie in Visual Basic einer Eigenschaft mithilfe der CByte-Funktion eine Spalte des SQL Server-Bittyps mit dem Wert 1 zuordnen, wird eine SqlException mit der Meldung "Arithmetischer Überlauffehler" ausgelöst. Im folgenden Beispiel wird die Product.MakeFlag Spalte in der AdventureWorks-Beispieldatenbank abgefragt, und beim Durchlaufen der Abfrageergebnisse tritt eine Ausnahme auf.
Using context As New AdventureWorksEntities()
Dim productsList = _
From product In context.Products _
Select CByte(product.MakeFlag)
' Throws an SqlException exception with a "Arithmetic overflow error
' for data type tinyint" message when a value of 1 is iterated over.
For Each makeFlag In productsList
Console.WriteLine(makeFlag)
Next
End Using
Verweisen auf nicht skalare Variablen, die nicht unterstützt werden
Das Verweisen auf nicht skalare Variablen, z. B. eine Entität, in einer Abfrage wird nicht unterstützt. Wenn eine solche Abfrage ausgeführt wird, wird eine NotSupportedException Ausnahme mit einer Meldung ausgelöst, die besagt: "Ein konstanter Wert vom Typ EntityTypekann nicht erstellt werden. In diesem Kontext werden nur primitive Typen (z. B. Int32, String und Guid) unterstützt."
Hinweis
Das Verweisen auf eine Auflistung von Skalarvariablen wird unterstützt.
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
Contact contact = context.Contacts.FirstOrDefault();
// Referencing a non-scalar closure in a query will
// throw an exception when the query is executed.
IQueryable<string> contacts = from c in context.Contacts
where c == contact
select c.LastName;
try
{
foreach (string name in contacts)
{
Console.WriteLine($"Name: ");
}
}
catch (NotSupportedException ex)
{
Console.WriteLine(ex.Message);
}
}
Using context As New AdventureWorksEntities()
Dim contact As Contact = context.Contacts.FirstOrDefault()
' Referencing a non-scalar closure in a query will
' throw an exception when the query is executed.
Dim contacts = From c In context.Contacts _
Where c.Equals(contact) _
Select c.LastName
Try
For Each name As String In contacts
Console.WriteLine("Name: ", name)
Next
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Using
Geschachtelte Abfragen können mit SQL Server 2000 fehlschlagen
Bei SQL Server 2000 können LINQ to Entities-Abfragen fehlschlagen, wenn sie geschachtelte Transact-SQL Abfragen erzeugen, die drei oder mehr Ebenen tief sind.
Projizieren auf einen anonymen Typ
Wenn Sie den anfänglichen Abfragepfad so definieren, dass mithilfe der Include-Methode verknüpfte Objekte in ObjectQuery<T> eingeschlossen werden, und dann LINQ verwenden, um die zurückgegebenen Objekte auf einen anonymen Typ zu projizieren, werden die in der Include-Methode angegebenen Objekte nicht in die Abfrageergebnisse eingeschlossen.
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var resultWithoutRelatedObjects =
context.Contacts.Include("SalesOrderHeaders").Select(c => new { c }).FirstOrDefault();
if (resultWithoutRelatedObjects.c.SalesOrderHeaders.Count == 0)
{
Console.WriteLine("No orders are included.");
}
}
Using context As New AdventureWorksEntities()
Dim resultWithoutRelatedObjects = context.Contacts. _
Include("SalesOrderHeaders"). _
Select(Function(c) New With {c}).FirstOrDefault()
If resultWithoutRelatedObjects.c.SalesOrderHeaders.Count = 0 Then
Console.WriteLine("No orders are included.")
End If
End Using
Wenn Sie verwandte Objekte abrufen möchten, geben Sie keine zurückgegebenen Typen an einen anonymen Typ zurück.
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var resultWithRelatedObjects =
context.Contacts.Include("SalesOrderHeaders").Select(c => c).FirstOrDefault();
if (resultWithRelatedObjects.SalesOrderHeaders.Count != 0)
{
Console.WriteLine("Orders are included.");
}
}
Using context As New AdventureWorksEntities()
Dim resultWithRelatedObjects = context.Contacts. _
Include("SalesOrderHeaders"). _
Select(Function(c) c).FirstOrDefault()
If resultWithRelatedObjects.SalesOrderHeaders.Count <> 0 Then
Console.WriteLine("Orders are included.")
End If
End Using