实体框架 - 使用视图模型的“GetAll”函数

时间:2011-09-21 21:49:21

标签: c# asp.net-mvc entity-framework asp.net-mvc-viewmodel

我创建了以下视图模型:

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

现在我需要创建一个函数来获取数据库中的所有属性及其相关图像。是否可以使用上面的viewmodel执行此操作?我尝试了以下内容。

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

对于我正在使用的paginatation方法,我需要返回一个IQueryable变量。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:3)

您的属性变量为null,因此您获得NullReferenceException - 只需使用实现IList<PropertyViewModel>的具体类的实例对其进行初始化:

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

更好的解决方案是通过使用EF PropertyImages查询在一个查询中获取所有相关Include() - 您的存储库层(您似乎在EF之上)必须支持这一点。目前,您正在对数据库执行N个查询,每个属性对应一个查询。

修改

这应该与使用EF Include()查询相同,后者会获取每个属性的相关PropertyImages

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