Share via


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, MyContactmet 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