Megosztás a következőn keresztül:


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 MyContactLastName 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