2010-09-06 8 views
2

Je suis nouveau à Linq et je suis aux prises avec ce que je pense être un problème d'exécution différée. J'ai une couche de données dans mon application qui utilise Linq to Sql et passe ensuite l'entité au viewmodel en utilisant un service WCF (architecture MVVM). L'objet est sérialisé à ce stade.Objet Linq to Sql non renseigné

Je passe un objet Employé qui devrait avoir un objet Rota enfant mais quand j'essaye d'y accéder dans mon modèle de vue depuis le WCF, Rota est nul. Si je vois l'objet employé dans le débogage avant qu'il ne soit passé, alors la Rota est sérialisée et est disponible dans mon modèle View. Ma requête Linq est une sélection simple, comment puis-je faire passer à travers le rota? Je pourrais passer en revue chaque employé afin d'énumérer l'objet de requête et de rotation mais ceci se sent très mal.

Répondre

3

Puisque vous utilisez LinqToSql, vous devez utiliser DataContext.LoadWith lorsque vous récupérez vos objets. C'est la manière préférée de dire à LinqToSql ce qu'il doit tirer vers le bas (car c'est par défaut une charge paresseuse).

DataLoadOptions options = new DataLoadOptions(); 
options.LoadWith((Employee c) => c.Rota); 
db.LoadOptions = options; 

http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx

Ceci a l'avantage d'être beaucoup plus efficace sur le côté SQL par rapport à l'appel ToList ou l'expansion des propriétés EntityRef individuellement.

+0

Exactement ce que je venais juste de commencer à lire - je me tourne lentement vers cette chose Linq! – Macros

0

Je suppose que Rota est contenue dans une collection. Définissez le type de collection sur List<Rota>, cela devrait fonctionner si c'est le cas.

0

Vous êtes déjà sur la bonne voie - la requête n'est exécutée qu'une fois que vous l'avez itérée (l'inspecter en mode débogage provoque également cette itération). Il suffit d'appeler ToList() sur le IQueryable (l'itérant ainsi) avant de l'envoyer via le service Web.