Partager via


Résultats de requête

Une fois qu'une requête LINQ to Entities a été convertie en arborescences de commandes puis exécutée, les résultats de la requête sont généralement retournés sous l'une des formes suivantes :

  • Une collection de zéro ou plusieurs objets entité typés ou une projection de types complexes dans le modèle EDM.

  • Types CLR pris en charge par le modèle EDM.

  • Collections inline.

  • Types anonymes.

Lorsque la requête a été exécutée sur la source de données, les résultats sont matérialisés en types CLR et retournés au client. La matérialisation d'objets est entièrement assurée par Entity Framework. Les erreurs qui résultent d'une impossibilité d'effectuer un mappage entre Entity Framework et le CLR provoquent la levée d'exceptions pendant la matérialisation d'objets.

Si l'exécution de la requête retourne des types EDM primitifs, les résultats se composent de types CLR autonomes et déconnectés d'Entity Framework. Toutefois, si la requête retourne une collection d'objets d'entité typés, représentée par ObjectQuery, ces types sont suivis par le contexte d'objet. Tous les comportements d'objet (tel que les collections enfants/parentes, le suivi des modifications, le polymorphisme, etc.) sont tels que définis dans l'Entity Framework. Ces fonctionnalités peuvent être utilisées en leur qualité, comme défini dans l'Entity Framework. Pour plus d'informations, voir Vue d'ensemble d'Object Services (Entity Framework).

Les types Struct retournés par les requêtes (tels que les types anonymes et les types complexes nullables) peuvent être de valeur null. Une propriété EntityCollection d'une entité retournée peut également être de valeur null. Cela peut être le résultat de la projection de la propriété de collection d'une entité de valeur null, par exemple, en cas d'appel de FirstOrDefault sur un objet ObjectQuery qui n'a pas d'éléments.

Dans certains cas, une requête peut sembler générer un résultat matérialisé pendant son exécution, mais il s'avère qu'elle est exécutée sur le serveur et que l'objet d'entité n'est jamais matérialisé dans le CLR. Cela peut être la cause de problèmes si vous êtes dépendant des effets secondaires de la matérialisation d'objets.

L'exemple suivant contient une classe personnalisée, MyContact, avec une propriété LastName. Lorsque la propriété LastName est définie, une variable count est incrémentée. Si vous exécutez les deux requêtes suivantes, la première incrémente count mais pas la deuxième. Cela est dû au fait que dans la deuxième requête, la propriété LastName est projetée à partir des résultats et que la classe MyContact n'est jamais créée, car elle n'est pas utile à l'exécution de la requête sur le magasin.

Public count As Integer = 0

Sub Main()

    Using AWEntities As New AdventureWorksEntities()

        Dim query1 = AWEntities.Contact _
        .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 _
        .Contact() _
        .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 static int count = 0;

static void Main(string[] args)
{
    using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
    {

        var query1 = AWEntities
           .Contact
           .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
           .Contact
           .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 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
public class MyContact
{

    String _lastName;

    public string LastName
    {
        get
        {
            return _lastName;
        }

        set
        {
            _lastName = value;
            count++;
        }
    }
}

Voir aussi

Autres ressources

Exécution de requêtes avec LINQ to Entities