Requêtes SQL brutes (EF6)

Entity Framework vous permet d'effectuer des requêtes à l'aide de LINQ avec vos classes d'entités. Cependant, il peut arriver que vous souhaitiez exécuter des requêtes utilisant le langage SQL brut directement dans la base de données. Cela inclut l'appel de procédures stockées, ce qui peut être utile pour les modèles Code First qui ne prennent pas actuellement en charge le mappage vers des procédures stockées. Les techniques présentées dans cette rubrique s’appliquent également aux modèles créés avec Code First et EF Designer.

Écriture de requêtes SQL pour les entités

La méthode SqlQuery sur DbSet permet d'écrire une requête SQL brute qui renverra des instances d'entités. Les objets renvoyés seront suivis par le contexte comme ils le seraient s'ils étaient renvoyés par une requête LINQ. Par exemple :

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();
}

Notez que, comme pour les requêtes LINQ, la requête n'est pas exécutée tant que les résultats n'ont pas été énumérés ; dans l'exemple ci-dessus, c'est ce qui est fait avec l'appel à ToList.

Il convient d'être prudent lorsque des requêtes SQL brutes sont écrites, et ce pour deux raisons. Tout d'abord, la requête doit être rédigée de manière à garantir qu'elle ne renvoie que des entités qui sont réellement du type demandé. Par exemple, lors de l'utilisation de fonctions telles que l'héritage, il est facile d'écrire une requête qui créera des entités du mauvais type CLR.

Deuxièmement, certains types de requêtes SQL brutes présentent des risques potentiels pour la sécurité, notamment en ce qui concerne les attaques par injection de code SQL. Veillez à utiliser correctement les paramètres dans votre requête afin de vous prémunir contre de telles attaques.

Chargement d’entités à partir de procédures stockées

Vous pouvez utiliser DbSet.SqlQuery pour charger des entités à partir des résultats d'une procédure stockée. Par exemple, le code suivant appelle la procédure dbo.GetBlogs dans la base de données :

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("dbo.GetBlogs").ToList();
}

Vous pouvez également passer des paramètres à une procédure stockée en utilisant la syntaxe suivante :

using (var context = new BloggingContext())
{
    var blogId = 1;

    var blogs = context.Blogs.SqlQuery("dbo.GetBlogById @p0", blogId).Single();
}

Écriture de requêtes SQL pour les types non-entité

Une requête SQL renvoyant des instances de n'importe quel type, y compris les types primitifs, peut être créée à l'aide de la méthode SqlQuery de la classe de base de données. Par exemple :

using (var context = new BloggingContext())
{
    var blogNames = context.Database.SqlQuery<string>(
                       "SELECT Name FROM dbo.Blogs").ToList();
}

Les résultats renvoyés par SqlQuery sur la base de données ne seront jamais suivis par le contexte, même si les objets sont des instances d'un type d'entité.

Envoi de commandes brutes à la base de données

Des commandes autres que des requêtes peuvent être envoyées à la base de données à l'aide de la méthode ExecuteSqlCommand sur la base de données. Par exemple :

using (var context = new BloggingContext())
{
    context.Database.ExecuteSqlCommand(
        "UPDATE dbo.Blogs SET Name = 'Another Name' WHERE BlogId = 1");
}

Notez que toute modification apportée aux données de la base de données à l'aide de ExecuteSqlCommand est opaque pour le contexte jusqu'à ce que les entités soient chargées ou rechargées à partir de la base de données.

Paramètres de sortie

Si des paramètres de sortie sont utilisés, leurs valeurs ne seront disponibles qu'après la lecture complète des résultats. Cela est dû au comportement sous-jacent de DbDataReader, consultez Récupération de données à l’aide d’un DataReader pour plus d’informations.