Queryresultaten
Nadat een LINQ naar entiteitenquery is geconverteerd naar opdrachtstructuren en uitgevoerd, worden de queryresultaten meestal als een van de volgende geretourneerd:
Een verzameling van nul of meer getypte entiteitsobjecten of een projectie van complexe typen in het conceptuele model.
CLR-typen die worden ondersteund door het conceptuele model.
Inlineverzamelingen.
Anonieme typen.
Wanneer de query is uitgevoerd op basis van de gegevensbron, worden de resultaten gerealiseerd in CLR-typen en geretourneerd naar de client. Alle object materialisatie wordt uitgevoerd door het Entity Framework. Fouten die het gevolg zijn van een onvermogen om toe te wijzen tussen het Entity Framework en de CLR, leiden ertoe dat er uitzonderingen worden gegenereerd tijdens het materialiseren van objecten.
Als de queryuitvoering primitieve conceptmodeltypen retourneert, bestaan de resultaten uit CLR-typen die zelfstandig zijn en die niet zijn verbonden met Entity Framework. Als de query echter een verzameling getypte entiteitsobjecten retourneert, vertegenwoordigd door ObjectQuery<T>, worden deze typen bijgehouden door de objectcontext. Alle objectgedrag (zoals onderliggende/bovenliggende verzamelingen, wijzigingen bijhouden, polymorfisme, enzovoort) zijn zoals gedefinieerd in het Entity Framework. Deze functionaliteit kan worden gebruikt in de capaciteit, zoals gedefinieerd in het Entity Framework. Zie Werken met objecten voor meer informatie.
Struct-typen die worden geretourneerd uit query's (zoals anonieme typen en nullable complexe typen) kunnen waarde null
hebben. Een EntityCollection<TEntity> eigenschap van een geretourneerde entiteit kan ook van null
waarde zijn. Dit kan het gevolg zijn van het projecteren van de verzamelingeigenschap van een entiteit die waarde null
heeft, zoals het aanroepen FirstOrDefault van een ObjectQuery<T> entiteit die geen elementen bevat.
In bepaalde situaties kan een query een gerealiseerd resultaat genereren tijdens de uitvoering, maar de query wordt uitgevoerd op de server en het entiteitsobject wordt nooit gerealiseerd in de CLR. Dit kan problemen veroorzaken als u afhankelijk bent van bijwerkingen van object materialisatie.
Het volgende voorbeeld bevat een aangepaste klasse, MyContact
met een LastName
eigenschap. Wanneer de LastName
eigenschap is ingesteld, wordt een count
variabele verhoogd. Als u de twee volgende query's uitvoert, wordt de eerste query verhoogd count
terwijl de tweede query dat niet doet. Dit komt doordat in de tweede query de LastName
eigenschap wordt geprojecteerd op basis van de resultaten en de klasse nooit wordt gemaakt, omdat deze MyContact
niet vereist is om de query in het archief uit te voeren.
public static int count = 0;
static void Main(string[] args)
{
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
var query1 = AWEntities
.Contacts
.Where(c => c.LastName == "Jones")
.Select(c => new MyContact { LastName = c.LastName });
// Execute the first query and print the count.
query1.ToList();
Console.WriteLine("Count: " + count);
//Reset the count variable.
count = 0;
var query2 = AWEntities
.Contacts
.Where(c => c.LastName == "Jones")
.Select(c => new MyContact { LastName = c.LastName })
.Select(my => my.LastName);
// Execute the second query and print the count.
query2.ToList();
Console.WriteLine("Count: " + count);
}
Console.WriteLine("Hit enter...");
Console.Read();
}
Public count As Integer = 0
Sub Main()
Using AWEntities As New AdventureWorksEntities()
Dim query1 = AWEntities.Contacts _
.Where(Function(c) c.LastName = "Jones") _
.Select(Function(c) New MyContact With {.LastName = c.LastName})
' Execute the first query and print the count.
query1.ToList()
Console.WriteLine("Count: " & count)
' Reset the count variable.
count = 0
Dim query2 = AWEntities _
.Contacts() _
.Where(Function(c) c.LastName = "Jones") _
.Select(Function(c) New MyContact With {.LastName = c.LastName}) _
.Select(Function(x) x.LastName)
' Execute the second query and print the count.
query2.ToList()
Console.WriteLine("Count: " & count)
End Using
End Sub
public class MyContact
{
String _lastName;
public string LastName
{
get
{
return _lastName;
}
set
{
_lastName = value;
count++;
}
}
}
Public Class MyContact
Private _lastName As String
Public Property LastName() As String
Get
Return _lastName
End Get
Set(ByVal value As String)
_lastName = value
count += 1
End Set
End Property
End Class