Procédure pas à pas : interrogation de relations (Visual Basic) (LINQ to SQL)
Mise à jour : November 2007
Cette procédure pas à pas explique comment utiliser des associations LINQ to SQL pour représenter les relations de clé étrangère dans la base de données.
Remarque : |
---|
Il est possible que votre ordinateur affiche des noms ou des emplacements différents pour certains des éléments d'interface utilisateur Visual Studio dans les instructions suivantes. L'édition de Visual Studio dont vous disposez et les paramètres que vous utilisez déterminent ces éléments. Pour plus d'informations, consultez Paramètres Visual Studio. |
Cette procédure pas à pas a été écrite à l'aide des paramètres de développement Visual Basic.
Composants requis
Vous devez avoir terminé Procédure pas à pas : requête et modèle objet simples (Visual Basic) (LINQ to SQL). Cette procédure pas à pas est basée sur cette dernière, y compris la présence du fichier northwnd.mdf dans c:\linqtest.
Vue d'ensemble
Cette procédure pas à pas se compose de trois tâches principales :
Ajout d'une classe d'entité pour représenter la table Orders dans l'exemple de base de données Northwind.
Ajout d'annotations à la classe Customer pour améliorer la relation entre les classes Customer et Order.
Création et exécution d'une requête pour essayer d'obtenir des informations Order en utilisant la classe Customer.
Mappage de relations entre des tables
Une fois la définition de classe Customer terminée, créez la définition de classe d'entité Order qui inclut le code suivant indiquant que Orders.Customer est une clé étrangère de Customers.CustomerID.
Pour ajouter la classe d'entité Order
Tapez ou collez le code suivant après la classe Customer :
<Table(Name:="Orders")> _ Public Class Order Private _OrderID As Integer Private _CustomerID As String Private _Customers As EntityRef(Of Customer) Public Sub New() Me._Customers = New EntityRef(Of Customer)() End Sub <Column(Storage:="_OrderID", DbType:="Int NOT NULL IDENTITY", _ IsPrimaryKey:=True, IsDBGenerated:=True)> _ Public ReadOnly Property OrderID() As Integer Get Return Me._OrderID End Get End Property ' No need to specify a setter because IsDBGenerated is true. <Column(Storage:="_CustomerID", DbType:="NChar(5)")> _ Public Property CustomerID() As String Get Return Me._CustomerID End Get Set(ByVal value As String) Me._CustomerID = value End Set End Property <Association(Storage:="_Customers", ThisKey:="CustomerID")> _ Public Property Customers() As Customer Get Return Me._Customers.Entity End Get Set(ByVal value As Customer) Me._Customers.Entity = value End Set End Property End Class
Annotation de la classe Customer
Dans cette étape, annotez la classe Customer pour indiquer sa relation avec la classe Order. Cet ajout n'est pas strictement nécessaire étant donné que la définition de la relation dans chacune des directions est suffisante pour créer le lien. Cependant, l'ajout de cette annotation vous permet de naviguer facilement parmi les objets dans chacune des directions.
Pour annoter la classe Customer
Tapez ou collez le code suivant dans la classe Customer :
Private _Orders As EntitySet(Of Order) Public Sub New() Me._Orders = New EntitySet(Of Order)() End Sub <Association(Storage:="_Orders", OtherKey:="CustomerID")> _ Public Property Orders() As EntitySet(Of Order) Get Return Me._Orders End Get Set(ByVal value As EntitySet(Of Order)) Me._Orders.Assign(value) End Set End Property
Création et exécution d'une requête dans la relation entre les classes Order et Customer
Vous pouvez désormais accéder aux objets Order directement à partir des objets Customer ou inversement. Vous n'avez pas besoin d'une jointure explicite entre les clients et les commandes.
Pour accéder aux objets Order à l'aide d'objets Customer
Modifiez la méthode Sub Main en tapant ou en collant le code suivant dans la méthode :
' Query for customers who have no orders. Dim custQuery = _ From cust In Customers _ Where Not cust.Orders.Any() _ Select cust Dim msg As String = "", title As String = _ "Customers With No Orders", response As MsgBoxResult, _ style As MsgBoxStyle = MsgBoxStyle.Information For Each custObj In custQuery msg &= String.Format(custObj.CustomerID & vbCrLf) Next response = MsgBox(msg, style, title)
Appuyez sur F5 pour déboguer l'application.
Deux noms apparaissent dans le message et la fenêtre de console affiche le code SQL généré.
Fermez le message pour arrêter le débogage.
Création d'une vue fortement typée de votre base de données
Il est beaucoup plus facile de démarrer avec une vue fortement typée de votre base de données. En effectuant un typage fort de l'objet DataContext, vous n'avez pas besoin d'effectuer des appels à GetTable. Vous pouvez utiliser des tables fortement typées dans toutes vos requêtes lorsque vous utilisez l'objet DataContext fortement typé.
Dans les étapes suivantes, vous créerez Customers comme table fortement typée qui mappe à la table Customers dans la base de données.
Pour effectuer un typage fort de l'objet DataContext
Ajoutez le code suivant au-dessus de la déclaration de classe Customer.
Public Class Northwind Inherits DataContext ' Table(Of T) abstracts database details per ' table/data type. Public Customers As Table(Of Customer) Public Orders As Table(Of Order) Public Sub New(ByVal connection As String) MyBase.New(connection) End Sub End Class
Modifiez Sub Main pour utiliser le DataContext fortement typé comme suit :
' Use a connection string. Dim db As New Northwind _ ("C:\linqtest\northwnd.mdf") ' Query for customers from Seattle. Dim custs = _ From cust In db.Customers _ Where cust.City = "Seattle" _ Select cust For Each custObj In custs Console.WriteLine("ID=" & custObj.CustomerID) Next ' Freeze the console window. Console.ReadLine()
Appuyez sur F5 pour déboguer l'application.
La sortie de la fenêtre de console est :
ID=WHITC
Appuyez sur Entrée dans la fenêtre de console pour fermer l'application.
Dans le menu Fichier, cliquez sur Enregistrer tout si vous souhaitez enregistrer cette application.
Étapes suivantes
La procédure pas à pas suivante (Procédure pas à pas : manipulation de données (Visual Basic) (LINQ to SQL)) explique comment manipuler des données. Cette procédure pas à pas ne requiert pas d'enregistrer les deux procédures pas à pas de cette série que vous avez déjà terminées.