2009-12-16 4 views
0

J'essaie de comprendre pourquoi, parfois, mes sous-objets disparaissent.LINQ to Entites: sous-objets disparaissant

À mon avis la liste, j'ai la norme

<% foreach (var item in Model) 

et quand j'inspecter les biens et le modèle, je peux voir que item.Map a deux ou trois éléments.

En fait, selon moi, la liste que je peux faire:

<% foreach (var map in item.Map) 
    <% Html.RenderPartial("MapView", map); %> 

et MapView peut accéder et afficher toutes les propriétés. Je compris les sous-objets avec:

list = from item in _entities.DataTable 
      .Include("LookupTable1") 
      .Include("Map") 
      .Include("Map.LookupTable2") select item; 
    return View("List", list); 

Mais si j'essaie de faire:

<%= Html.Encode(item.Map.FirstOrDefault().Field)%> 

-je obtenir une exception de pointeur nul et item.Map a 0 éléments.

Quelqu'un peut-il expliquer pourquoi cela se produit?

+0

-t-il des éléments 0 ou est-ce nul? Qu'est-ce qui cause le null-pointeur, alors quel objet est nul? –

+0

Lorsque je définis le point d'arrêt sur le 1er foreach, item.Map a 2 éléments. Le 2ème foreach itère à travers 2 éléments de carte. C'est juste quand j'essaie d'accéder à item.Map.First() que la collection de cartes est soudainement nulle. – chris

Répondre

0

Vous pourriez probablement faire sans les instructions .Include. Je ne suis pas sûr si cela résout votre problème, sans connaître la cause du null-pointeur. Juste comme une note: lorsque vous faites MVC, vous ne devriez probablement pas faire de requêtes Linq dans la vue (comme .FirstOrDefault).

list = from item in _entities.DataTable 
     select new 
     { 
      Name = item.Name 
      Maps = item.Maps 
     }; 

En utilisant cette syntaxe, vous pouvez exécuter plusieurs requêtes LINQ dans le contrôleur au lieu

list = from item in _entities.DataTable 
     select new 
     { 
      Name = item.Name 
      FirstMap = item.Maps.FirstOrDefault() 
     }; 

Ou encore

list = from item in _entities.DataTable 
     select new 
     { 
      Name = item.Name 
      Maps = from map in item.Maps 
        where map = somecondition 
        select map 
     };