Výsledky dotazu
Jakmile se dotaz LINQ to Entities převede na stromy příkazů a spustí se, výsledky dotazu se obvykle vrátí jako jeden z následujících způsobů:
Kolekce nulových nebo více objektů entit typu nebo projekce složitých typů v koncepčním modelu.
Typy CLR podporované koncepčním modelem
Vložené kolekce.
Anonymní typy.
Když se dotaz provede vůči zdroji dat, výsledky se materializují do typů CLR a vrátí se klientovi. Všechna materializace objektů se provádí rozhraním Entity Framework. Všechny chyby, které vyplývají z nemožnosti mapování mezi Entity Framework a CLR, způsobí vyvolání výjimek během materializace objektů.
Pokud provádění dotazu vrátí primitivní koncepční typy modelu, výsledky se skládají z typů CLR, které jsou samostatné a odpojené od entity Framework. Pokud však dotaz vrátí kolekci objektů entit, které jsou reprezentovány ObjectQuery<T>, tyto typy jsou sledovány kontextem objektu. Veškeré chování objektů (například podřízené nebo nadřazené kolekce, sledování změn, polymorfismus atd.) jsou definovány v entity Frameworku. Tuto funkci lze použít v její kapacitě, jak je definováno v Entity Frameworku. Další informace naleznete v tématu Práce s objekty.
Typy struktury vrácené z dotazů (například anonymní typy a komplexní typy s možnou null
hodnotou null) mohou být hodnoty. Vlastnost EntityCollection<TEntity> vrácené entity může být null
také hodnota. To může mít za následek promítání vlastnosti kolekce entity, která je null
hodnota, například volání FirstOrDefault na objekt ObjectQuery<T> , který nemá žádné prvky.
V některých situacích se dotaz může zdát, že během provádění vygeneruje materializovaný výsledek, ale dotaz se spustí na serveru a objekt entity nebude v CLR nikdy materializován. To může způsobit problémy, pokud jste v závislosti na vedlejší účinky materializace objektů.
Následující příklad obsahuje vlastní třídu , MyContact
s LastName
vlastností. LastName
Při nastavení count
vlastnosti se zvýší proměnná. Pokud spustíte následující dva dotazy, první dotaz se zvýší count
, zatímco druhý dotaz nebude. Důvodem je to, že ve druhém dotazu LastName
se vlastnost promítá z výsledků a MyContact
třída se nikdy nevytvoří, protože není nutné spustit dotaz v úložišti.
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