2011-09-21 1 views
1

J'ai créé le modèle de vue suivant:Entity Framework - Une fonction « GetAll » aide d'une vue modèle

public class PropertyViewModel 
{ 
    public PropertyViewModel(Property property, IList<PropertyImage> images) 
    { 
     this.property = property; 
     this.images = images; 
    } 

    public Property property { get; private set; } 
    public IList<PropertyImage> images { get; private set; } 
} 

Maintenant, je dois créer une fonction qui obtient toutes les propriétés de la base de données ainsi que leur associé images. Est-il possible de le faire en utilisant le viewmodel ci-dessus? J'ai essayé ce qui suit.

public IList<PropertyViewModel> GetAllPropertyViews() 
    { 
     IList<PropertyViewModel> properties = null; 
     foreach (var property in GetAllProperties().ToList()) 
     { 
      IList<PropertyImage> images = db.PropertyImages.Where(m => m.Property.PropertyID == property.PropertyID).ToList(); 
      properties.Add(new PropertyViewModel(property, images)); 
     } 
     return properties; 
    } 

Cela ne fonctionne pas, il donne "Référence d'objet non définie sur une instance d'un objet". à properties.Add(new PropertyViewModel(property, images));

Pour la méthode de pagination que j'utilise, je dois retourner une variable IQueryable. Toutes les suggestions seraient grandement appréciées.

Répondre

3

votre variable de propriétés est null, d'où vous obtenez une NullReferenceException - juste initialiser avec une instance d'une classe concrète qui implémente IList<PropertyViewModel>:

IList<PropertyViewModel> properties = new List<PropertyViewModel>(); 

Une meilleure solution serait d'obtenir toutes les PropertyImages liées à un requête à l'aide d'une requête EF Include() - votre couche de référentiel (que vous semblez avoir au-dessus d'EF) doit cependant le supporter. Actuellement, vous exécutez N requêtes sur votre base de données, une pour chaque propriété.

Edit:

Cela devrait être l'équivalent en utilisant la requête EF Include(), qui saisira la PropertyImages liée pour chaque propriété:

var properties = db.Properties 
        .Include(x=> x.PropertyImages); 
        .Select(x => new PropertyViewModel(x, x.PropertyImages.ToList()) 
        .ToList(); 
+0

Merci beaucoup pour cette réponse rapide! Je suis nouveau à cela, comment pourrais-je utiliser 'Include()' pour une requête plus efficace? –

+1

@Michael: Réponse mise à jour pour afficher l'équivalent – BrokenGlass

Questions connexes