Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 in zijn capaciteit worden gebruikt, 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 objectmaterialisatie.
Het volgende voorbeeld bevat een aangepaste klasse, MyContactmet een LastName eigenschap. Wanneer de LastName eigenschap is ingesteld, wordt een count variabele verhoogd. Als u de twee volgende query's uitvoert, zal de eerste query count verhogen, terwijl de tweede query dat niet zal doen. Dit komt doordat in de tweede query de LastName-eigenschap wordt geprojecteerd op basis van de resultaten en de MyContact-klasse nooit wordt aangemaakt, omdat deze niet nodig is om de query op de opslag 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