Esecuzione di query tra relazioniQuerying Across Relationships

I riferimenti ad altri oggetti o raccolte di altri oggetti nelle definizioni della classe corrispondono direttamente alle relazioni di chiavi esterne nel database.References to other objects or collections of other objects in your class definitions directly correspond to foreign-key relationships in the database. È possibile usare queste relazioni quando si esegue una query usando la notazione del punto per accedere alle proprietà della relazione e spostarsi tra gli oggetti.You can use these relationships when you query by using dot notation to access the relationship properties and navigate from one object to another. Queste operazioni di accesso vengono convertite in join più complessi o sottoquery correlate nell'equivalente SQL.These access operations translate to more complex joins or correlated subqueries in the equivalent SQL.

Ad esempio, usando la query seguente è possibile spostarsi da ordini a clienti per limitare i risultati solo agli ordini per i clienti residenti nell'area londinese.For example, the following query navigates from orders to customers as a way to restrict the results to only those orders for customers located in London.

        Northwnd db = new Northwnd(@"northwnd.mdf");

        IQueryable<Order> londonOrderQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select ord;
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim londonOrderQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord

Se le proprietà della relazione non esistessero sarebbe necessario scriverle manualmente come join, esattamente come si farebbe in una query SQL, come illustrato nel codice seguente:If relationship properties did not exist you would have to write them manually as joins, just as you would do in a SQL query, as in the following code:

        Northwnd db = new Northwnd(@"northwnd.mdf");
        IQueryable<Order> londonOrderQuery =
from cust in db.Customers
join ord in db.Orders on cust.CustomerID equals ord.CustomerID
where cust.City == "London"
select ord;
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim londOrderQuery = _
From cust In db.Customers _
Join ord In db.Orders On cust.CustomerID Equals ord.CustomerID _
Select ord

È possibile utilizzare il relazione proprietà per definire questa particolare relazione una volta.You can use the relationship property to define this particular relationship one time. quindi usare la più pratica sintassi del punto.You can then use the more convenient dot syntax. Le proprietà della relazione esistono tuttavia soprattutto perché i modelli a oggetti specifici del dominio sono in genere definiti come gerarchie o grafici.But relationship properties exist more importantly because domain-specific object models are typically defined as hierarchies or graphs. Gli oggetti usati nella programmazione dispongono di riferimenti ad altri oggetti.The objects that you program against have references to other objects. È solo una coincidenza che le relazioni da oggetto a oggetto corrispondano alle relazioni di tipo chiave esterna nei database.It is only a happy coincidence that object-to-object relationships correspond to foreign-key-styled relationships in databases. L'accesso alle proprietà offre quindi un modo pratico per scrivere join.Property access then provides a convenient way to write joins.

A questo riguardo, le proprietà della relazione sono più importanti sul lato dei risultati di una query anziché nella query stessa.With regard to this, relationship properties are more important on the results side of a query than as part of the query itself. Dopo il recupero dei dati su un cliente particolare tramite la query, la definizione della classe indica che sono presenti ordini.After the query has retrieved data about a particular customer, the class definition indicates that customers have orders. In altre parole, si prevede che la proprietà Orders di un particolare cliente sia una raccolta popolata con tutti gli ordini di tale cliente.In other words, you expect the Orders property of a particular customer to be a collection that is populated with all the orders from that customer. Si tratta in effetti del contratto dichiarato definendo le classi in questo modo.That is in fact the contract you declared by defining the classes in this manner. Si prevede che nei risultati siano inclusi gli ordini, anche se non sono stati espressamente richiesti nella query.You expect to see the orders there even if the query did not request orders. Si prevede che il modello a oggetti appaia come un'estensione in memoria del database con gli oggetti correlati immediatamente disponibili.You expect your object model to maintain an illusion that it is an in-memory extension of the database with related objects immediately available.

Dopo avere creato le relazioni, è possibile scrivere query facendo riferimento alle proprietà delle relazioni definite nelle classi.Now that you have relationships, you can write queries by referring to the relationship properties defined in your classes. Questi riferimenti alle relazioni corrispondono alle relazioni di chiave esterna nel database.These relationship references correspond to foreign-key relationships in the database. Le operazioni che usano queste relazioni vengono convertite in join più complessi nell'equivalente SQL.Operations that use these relationships translate to more complex joins in the equivalent SQL. A condizione che sia stata definita una relazione usando l'attributo AssociationAttribute, non sarà necessario codificare un join esplicito in LINQ to SQLLINQ to SQL.As long as you have defined a relationship (using the AssociationAttribute attribute), you do not have to code an explicit join in LINQ to SQLLINQ to SQL.

Per mantenere questa apparenza, LINQ to SQLLINQ to SQL implementa una tecnica denominata il caricamento posticipato.To help maintain this illusion, LINQ to SQLLINQ to SQL implements a technique called deferred loading. Per ulteriori informazioni, vedere posticipata e il caricamento immediato.For more information, see Deferred versus Immediate Loading.

Si consideri la query SQL seguente al progetto un elenco di CustomerID - OrderID coppie:Consider the following SQL query to project a list of CustomerID-OrderID pairs:

SELECT t0.CustomerID, t1.OrderID  
FROM   Customers AS t0 INNER JOIN  
          Orders AS t1 ON t0.CustomerID = t1.CustomerID  
WHERE  (t0.City = @p0)  

Per ottenere gli stessi risultati tramite LINQ to SQLLINQ to SQL, usare il riferimento alla proprietà Orders esistente nella classe Customer.To obtain the same results by using LINQ to SQLLINQ to SQL, you use the Orders property reference already existing in the Customer class. Il Orders riferimento fornisce le informazioni necessarie per eseguire la query e il progetto di CustomerID - OrderID coppie, come illustrato nel codice seguente:The Orders reference provides the necessary information to execute the query and project the CustomerID-OrderID pairs, as in the following code:

        Northwnd db = new Northwnd(@"northwnd.mdf");
        var idQuery =
from cust in db.Customers
from ord in cust.Orders
where cust.City == "London"
select new { cust.CustomerID, ord.OrderID };
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim idQuery = _
From cust In db.Customers, ord In cust.Orders _
Where cust.City = "London" _
Select cust.CustomerID, ord.OrderID

È inoltre possibile procedere in senso inverso,You can also do the reverse. ovvero eseguire una query su Orders e usare il relativo riferimento alla relazione di Customer per accedere alle informazioni sull'oggetto Customer associato.That is, you can query Orders and use its Customer relationship reference to access information about the associated Customer object. Il codice seguente vengono proiettate le stesse CustomerID - OrderID coppie come in precedenza, ma questa volta eseguendo una query Orders anziché Customers.The following code projects the same CustomerID-OrderID pairs as before, but this time by querying Orders instead of Customers.

        Northwnd db = new Northwnd(@"northwnd.mdf");
        var idQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select new { ord.Customer.CustomerID, ord.OrderID };
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim idQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord.CustomerID, ord.OrderID

Vedere ancheSee Also

Concetti relativi alle queryQuery Concepts