Lekérdezés eredményei
Miután a LINQ–Entitások lekérdezés parancsfákká lett konvertálva és végrehajtva, a lekérdezés eredményei általában az alábbiak egyikeként jelennek meg:
Nulla vagy több beírt entitásobjektum gyűjteménye, vagy összetett típusok kivetítése a fogalmi modellben.
A fogalmi modell által támogatott CLR-típusok.
Beágyazott gyűjtemények.
Névtelen típusok.
Amikor a lekérdezés az adatforráson lett végrehajtva, az eredmények CLR-típusokba kerülnek, és visszakerülnek az ügyfélhez. Minden objektum-materializálást az Entity Framework hajt végre. Az entitás-keretrendszer és a CLR közötti leképezés sikertelenségéből eredő hibák kivételeket okoznak az objektum materializálása során.
Ha a lekérdezés végrehajtása primitív elméleti modelltípusokat ad vissza, az eredmények olyan CLR-típusokból állnak, amelyek különállóak és nem kapcsolódnak az Entity Frameworkhez. Ha azonban a lekérdezés gépelt entitásobjektumok gyűjteményét adja vissza, ezeket ObjectQuery<T>a típusokat az objektumkörnyezet követi nyomon. Minden objektum viselkedése (például gyermek-/szülőgyűjtemények, változáskövetés, polimorfizmus stb.) az Entity Frameworkben van definiálva. Ez a funkció az entitás-keretrendszerben meghatározott kapacitásban használható. További információ: Az objektumok használata.
A lekérdezésekből visszaadott strukturált típusok (például névtelen típusok és null értékű összetett típusok) lehetnek értékesek null
. A EntityCollection<TEntity> visszaadott entitások tulajdonsága null
is lehet érték. Ennek az lehet az eredménye, hogy egy értéknek megfelelő entitás gyűjteménytulajdonságát null
veti ki, például olyan entitást ObjectQuery<T> hív megFirstOrDefault, amely nem rendelkezik elemekkel.
Bizonyos helyzetekben előfordulhat, hogy egy lekérdezés materializált eredményt hoz létre a végrehajtás során, de a lekérdezés a kiszolgálón lesz végrehajtva, és az entitásobjektum soha nem lesz materializálva a CLR-ben. Ez problémákat okozhat, ha az objektum materializálásának mellékhatásaitól függ.
Az alábbi példa egy tulajdonsággal rendelkező egyéni osztályt MyContact
LastName
tartalmaz. Ha a LastName
tulajdonság be van állítva, egy count
változó növekszik. Ha a következő két lekérdezést hajtja végre, az első lekérdezés növekszik count
, míg a második lekérdezés nem. Ennek az az oka, hogy a második lekérdezésben a LastName
tulajdonság az eredményekből lesz kivetítve, és az MyContact
osztály soha nem jön létre, mert nem szükséges végrehajtani a lekérdezést az áruházban.
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