Ich habe meine App beschleunigt, indem ich kompilierte Abfragen für Abfragen verwendet habe, die immer wieder ausgeführt wurden.
Ich habe versucht, es so zu implementieren:
Function Select(ByVal fk_id As Integer) As List(SomeEntity)
Using db As New DataContext()
db.ObjectTrackingEnabled = False
Return CompiledSelect(db, fk_id)
End Using
End Function
Shared CompiledSelect As Func(Of DataContext, Integer, List(Of SomeEntity)) = _
CompiledQuery.Compile(Function(db As DataContext, fk_id As Integer) _
(From u In db.SomeEntities _
Where u.SomeLinkedEntity.ID = fk_id _
Select u).ToList())
Dies hat nicht funktioniert und ich habe diese Fehlermeldung erhalten:
Typ: System.ArgumentNullException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Nachricht: Der Wert darf nicht NULL sein.
Parametername: Wert
Aber als ich meine kompilierte Abfrage geändert habe, um IQueryable statt List zurückzugeben, wie folgt:
Function Select(ByVal fk_id As Integer) As List(SomeEntity)
Using db As New DataContext()
db.ObjectTrackingEnabled = False
Return CompiledSelect(db, fk_id).ToList()
End Using
End Function
Shared CompiledSelect As Func(Of DataContext, Integer, IQueryable(Of SomeEntity)) = _
CompiledQuery.Compile(Function(db As DataContext, fk_id As Integer) _
From u In db.SomeEntities _
Where u.SomeLinkedEntity.ID = fk_id _
Select u)
hat es gut funktioniert. Kann jemand erklären, warum das so ist?
Übrigens, kompilierte Abfragen sind großartig! Sie haben meine App um den Faktor 2 beschleunigt.