2010-05-22 4 views
20

quelle est la différence entre loadwith et associatedwith. D'après les articles que j'ai lus il semble que loadwith est utilisé pour charger des données supplémentaires (par exemple toutes les commandes pour les clients). While AssociateWith est utilisé pour filtrer les données.linq à sql loadwith vs associatedwith

Est-ce une bonne compréhension? Aussi, ce sera bien si quelqu'un peut expliquer cela avec une explication basée sur un exemple.

Répondre

30

LoadWith est utilisé pour effectuer une charge désireux d'une association par opposition à la valeur par défaut charge paresseux.

Normalement, les associations sont chargées la première fois que vous les référencez. Cela signifie que si vous sélectionnez 100 Order instances, puis que vous faites quelque chose avec chacun de leurs Details, vous effectuez en réalité 101 SELECT opérations sur la base de données. D'autre part, si le LoadOptions spécifier LoadWith<Order>(o => o.Details), alors tout est fait dans un seul SELECT avec un JOIN ajouté.

AssociateWith n'a pas d'effet sur lorsque l'association est chargée, juste ce que est chargé. Il ajoute une clause WHERE chaque fois que vous chargez une association.

Comme vous le dites, AssociateWith est utilisé pour automatiquement les données du filtre. En règle générale, vous utiliserez ceci si vous savez qu'une association contient un très grand nombre d'éléments et que vous n'avez besoin que d'un sous-ensemble spécifique. Encore une fois, c'est principalement une optimisation des performances, juste un genre différent.

+6

Cette ligne m'a clairement indiqué "AssociateWith n'a aucun effet sur le moment où l'association est chargée, juste ce qui est chargé". Merci. – stackoverflowuser

7

Oui, votre compréhension est correcte; AssociateWith filtre les données avant les requêtes, tandis que LoadWith renvoie les objets associés dans la requête. La raison de LoadWith est que vous pouvez renvoyer des objets associés dans une seule requête. Sinon, des appels db supplémentaires seront effectués au moment où vous itérez sur vos objets associés. Essayez différents exemples vous-même et jetez un coup d'œil sur le SQL généré par Profiler ou un autre enregistreur. Souvenez-vous que ces options doivent être définies sur votre DataContext avant d'effectuer des requêtes. Jetez un oeil aux exemples dans les liens ci-dessous (MSDN).

Je viens de copier les exemples qu'ils utilisent ici.

LoadWith

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Customer>(c => c.Orders); 
db.LoadOptions = dlo; 

var londonCustomers = from cust in db.Customers 
         where cust.City == "London" 
         select cust; 

AssociateWith

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.AssociateWith<Customer>(
    c => c.Orders.Where(p => p.ShippedDate != DateTime.Today)); 
db.LoadOptions = dlo; 

var custOrderQuery = from cust in db.Customers 
        where cust.City == "London" 
        select cust;