Partage via


Procédure : Exécuter directement des requêtes SQL

LINQ to SQL traduit les requêtes que vous écrivez dans les requêtes SQL paramétrées (sous forme textuelle) et les envoie au serveur SQL pour traitement.

SQL ne peut pas exécuter les diverses méthodes qui peuvent être localement disponibles pour votre application. LINQ to SQL essaie de convertir ces méthodes locales en opérations et fonctions équivalentes qui sont disponibles à l’intérieur de l’environnement SQL. La plupart des méthodes et des opérateurs sur les types intégrés du .NET Framework ont des traductions directes en commandes SQL. Certains peuvent être produits à partir des fonctions disponibles. Ceux qui ne peuvent pas être produits génèrent des exceptions runtime. Pour plus d’informations, consultez Mappage des types SQL-CLR.

Dans les cas où une requête LINQ to SQL est insuffisante pour une tâche spécialisée, vous pouvez utiliser la méthode ExecuteQuery pour exécuter une requête SQL, puis convertir directement le résultat de votre requête en objets.

Exemple 1

Dans l'exemple suivant, supposons que les données de la classe Customer sont réparties sur deux tables (customer1 et customer2). La requête retourne une séquence d'objets Customer.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");
IEnumerable<Customer> results = db.ExecuteQuery<Customer>
(@"SELECT c1.custid as CustomerID, c2.custName as ContactName
    FROM customer1 as c1, customer2 as c2
    WHERE c1.custid = c2.custid"
);
Dim db As New Northwnd("c:\northwnd.mdf")
Dim results As IEnumerable(Of Customer) = _
    db.ExecuteQuery(Of Customer) _
    ("SELECT c1.custID as CustomerID," & _
    "c2.custName as ContactName" & _
    "FROM customer1 AS c1, customer2 as c2" & _
    "WHERE c1.custid = c2.custid")

Tant que les noms de colonne des résultats sous forme de tableau correspondent aux propriétés des colonnes de votre classe d’entité, LINQ to SQL crée vos objets à partir de n’importe quelle requête SQL.

Exemple 2

La méthode ExecuteQuery autorise également les paramètres. Utilisez un code similaire à l'exemple de code suivant pour exécuter une requête paramétrée.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");
IEnumerable<Customer> results = db.ExecuteQuery<Customer>
    ("SELECT contactname FROM customers WHERE city = {0}",
    "London");
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim results As IEnumerable(Of Customer) = _
db.ExecuteQuery(Of Customer) _
("SELECT contactname FROM customers WHERE city = {0}, 'London'")

Les paramètres sont exprimés dans le texte de requête en utilisant la même notation avec accolades utilisée par Console.WriteLine() et String.Format(). En fait, String.Format() est réellement appelé sur la chaîne de requête que vous fournissez, en substituant les paramètres entre accolades par des noms de paramètre générés tels @p0, @p1 ..., @p(n).

Voir aussi