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ą , MyContact
z 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