Abfrageergebnisse

Nachdem eine LINQ to Entities-Abfrage in eine Befehlsstruktur konvertiert und ausgeführt wurde, werden die Abfrageergebnisse im Allgemeinen in einer der folgenden Formen zurückgegeben:

  • Eine Auflistung von 0 (null) oder mehr typisierten Entitätsobjekten oder eine Projektion komplexer Typen im konzeptionellen Modell.

  • Vom konzeptionellen Modell unterstützte CLR-Typen.

  • Inlineauflistungen

  • Anonyme Typen

Wenn die Abfrage in der Datenquelle ausgeführt wurde, werden die Ergebnisse in CLR-Typen materialisiert und an den Client zurückgegeben. Jede Objektmaterialisierung wird vom Entity Framework durchgeführt. Alle Fehler, die dadurch entstehen, dass zwischen dem Entity Framework und der CLR keine Zuordnung vorgenommen werden kann, lösen bei der Objektmaterialisierung Ausnahmen aus.

Wenn die Abfrage primitive Typen des konzeptionellen Modells zurückgibt, besteht das Ergebnis aus CLR-Typen, die eigenständig und vom Entity Framework getrennt sind. Wenn die Abfrage jedoch eine durch ObjectQuery<T> dargestellte Auflistung typisierter Entitätsobjekte zurückgibt, werden diese Typen vom Objektkontext nachverfolgt. Das Objektverhalten (wie Sammlungen von über- und untergeordneten Elementen, Änderungsnachverfolgung, Polymorphie usw.) richtet sich nach der Definition im Entity Framework. Diese Funktionalität kann, wie im Entity Framework definiert, in vollem Umfang verwendet werden. Weitere Informationen finden Sie unter Arbeiten mit Objekten.

Von Abfragen zurückgegebene Strukturtypen (wie anonyme Typen und komplexe Typen, die NULL-Werte zulassen) können den Wert null haben. Eine EntityCollection<TEntity>-Eigenschaft einer zurückgegebenen Entität kann ebenfalls den Wert null haben. Dies kann durch die Projektion einer Auflistungseigenschaft einer Entität geschehen, die den Wert null hat, wie ein Aufruf von FirstOrDefault für eine ObjectQuery<T>, die über keine Elemente verfügt.

In einigen Fällen kann es den Anschein haben, dass eine Abfrage bei ihrer Ausführung ein materialisiertes Ergebnis erstellt, während die Abfrage tatsächlich auf dem Server ausgeführt wird und das Entitätsobjekt nicht in der CLR materialisiert wird. Dies kann Probleme verursachen, wenn Nebeneffekte der Objektmaterialisierung von Bedeutung sind.

Im folgenden Beispiel ist eine benutzerdefinierte Klasse, MyContact, mit einer LastName-Eigenschaft enthalten. Wenn die LastName-Eigenschaft festgelegt wird, wird eine count-Variable inkrementiert. Bei der Ausführung der folgenden beiden Abfragen inkrementiert die erste count, die zweite jedoch nicht. Der Grund dafür ist, dass in der zweiten Abfrage die LastName-Eigenschaft aus den Ergebnissen projiziert wird und die MyContact-Klasse nicht erstellt wird, da es nicht nötig ist, die Abfrage im Speicher auszuführen.

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