Entity Framework - функция GetAll, использующая модель представления - PullRequest
1 голос
/ 22 сентября 2011

Я создал следующую модель представления:

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; }
}

Теперь мне нужно создать функцию, которая получает все свойства в базе данных вместе с соответствующими изображениями. Возможно ли это сделать с помощью представленной выше модели представления? Я пробовал следующее.

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;
    }

Это не работает, оно дает «Ссылка на объект не установлена ​​на экземпляр объекта». на properties.Add(new PropertyViewModel(property, images));

Для метода разбивки на страницы, который я использую, мне нужно вернуть переменную IQueryable. Любые предложения будут с благодарностью.

1 Ответ

3 голосов
/ 22 сентября 2011

Ваша переменная свойств равна null, следовательно, вы получаете NullReferenceException - просто инициализируйте его экземпляром конкретного класса, который реализует IList<PropertyViewModel>:

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

Лучшим решением было быполучите все связанные PropertyImages в одном запросе, используя запрос EF Include() - хотя ваш уровень хранилища (который у вас, похоже, поверх EF) должен поддерживать это.В настоящее время вы выполняете N запросов к вашей базе данных, по одному для каждого свойства.

Редактировать:

Это должно быть эквивалентно использованию запроса EF Include(), который будет захватыватьPropertyImages для каждого свойства:

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