Udostępnij za pośrednictwem


Wyniki zapytania

Po przekonwertowaniu zapytania LINQ to Entities na drzewa poleceń i wykonaniu wyniki zapytania są zwykle zwracane jako jedno z następujących elementów:

  • Kolekcja obiektów jednostki typu zero lub więcej lub projekcja typów złożonych w modelu koncepcyjnym.

  • Typy CLR obsługiwane przez model koncepcyjny.

  • Kolekcje wbudowane.

  • Typy anonimowe.

Po wykonaniu zapytania względem źródła danych wyniki są zmaterializowane w typach CLR i zwracane do klienta. Cała materializacja obiektów jest wykonywana przez program Entity Framework. Wszelkie błędy, które wynikają z braku możliwości mapowania między programem Entity Framework i CLR, spowodują zgłaszanie wyjątków podczas materializacji obiektów.

Jeśli wykonanie zapytania zwraca pierwotne typy modeli koncepcyjnych, wyniki składają się z typów CLR, które są autonomiczne i odłączone od platformy Entity Framework. Jeśli jednak zapytanie zwraca kolekcję typowych obiektów jednostek reprezentowanych przez ObjectQuery<T>, te typy są śledzone przez kontekst obiektu. Wszystkie zachowania obiektów (takie jak kolekcje podrzędne/nadrzędne, śledzenie zmian, polimorfizm itd.) są zdefiniowane w programie Entity Framework. Tej funkcji można używać w pojemności zgodnie z definicją w programie Entity Framework. Aby uzyskać więcej informacji, zobacz Praca z obiektami.

Typy struktur zwracane z zapytań (takich jak typy anonimowe i typy złożone dopuszczane do wartości null) mogą być wartością null . EntityCollection<TEntity> Właściwość zwróconej jednostki może być również wartościąnull. Może to wynikać z projekcji właściwości kolekcji jednostki, która jest null wartością, na przykład wywołania FirstOrDefault elementu ObjectQuery<T> bez elementów.

W niektórych sytuacjach zapytanie może wydawać się generować zmaterializowany wynik podczas wykonywania, ale zapytanie zostanie wykonane na serwerze, a obiekt jednostki nigdy nie zostanie zmaterializowany w clR. Może to powodować problemy w zależności od skutków ubocznych materializacji obiektów.

Poniższy przykład zawiera klasę niestandardową , MyContactz właściwością LastName . Po ustawieniu LastName właściwości zmienna count jest zwiększana. Jeśli wykonasz dwa następujące zapytania, pierwsze zapytanie zwiększy count się, podczas gdy drugie zapytanie nie będzie. Jest to spowodowane tym, że w drugim zapytaniu LastName właściwość jest przewidywana na podstawie wyników, a MyContact klasa nigdy nie jest tworzona, ponieważ nie jest wymagana do wykonania zapytania w magazynie.

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