如何将ObjectSet从实体转换为IEnumerable模型?

时间:2012-06-29 23:53:07

标签: asp.net-mvc-3 casting entity-framework-4.1 repository-pattern

我正在使用MVC3,Razor和Entity Framework 4.1构建一个测试应用程序,采用模式优先方法(与代码优先方法相对应),在存储库模式中。我想避免在我的视图中访问数据对象,而是访问模型,但我遇到了问题。据我所知,数据对象是作为ObjectSet从数据层返回的,但是我的View需要IEnumerable,我不知道如何将一个转换为另一个。

以下是一些代码,以帮助澄清。


型号......

namespace TestSolution.Models
{
    public class ProjectModel
    {
        [HiddenInput]
        public int Id { get; set; }

        [Required]
        [StringLength(255, ErrorMessage = "The name cannot be more than 255 characters long.")]
        [Display(Name = "Name")]
        public string Name { get; set; }

        [Required]
        [Display(Name = "Description")]
        public string Description { get; set; }
    }
}

存储库...

public IQueryable<ProjectModel> GetProjects()
{
    return Db.Project;
}

实体......

public ObjectSet<Project> Project
{
    get
    {
        if ((_Project == null))
        {
            _Project = base.CreateObjectSet<Project>("Project");
        }
        return _Project;
    }
}

控制器......

public ActionResult Index()
{
    IEnumerable<TestSolution.Models.ProjectModel> model = _projectRepository.GetProjects();
    return View(model);
}

查看...

@model IEnumerable<TestSolution.Models.ProjectModel>

构建时遇到错误...

Cannot implicitly convert type 'System.Data.Objects.ObjectSet<TestSolution.Project>' to 'System.Linq.IQueryable<TestSolution.Models.ProjectModel>'. An explicit conversion exists (are you missing a cast?)

这个问题有意义吗?我只是不确定从哪里开始......你们给我的任何建议都会很棒。 :)

编辑:我能够通过将我的存储库代码更改为......来解决这个问题。

public IQueryable<ProjectModel> GetProjects()
{
  return Db.Project.Select(i => new ProjectModel() { Id = i.Id, Name = i.Name, Description = i.Description });
}

1 个答案:

答案 0 :(得分:1)

问题不是从ObjectSet<T>转换为IEnumerable<T>ObjectSet<T> implements IEnumerable<T>)。

问题是从TestSolution.Project转换为TestSolution.Models.ProjectModel。您需要编写一些转换代码,可能类似于以下内容:

model.Select(i => new ProjectModel() { /* Set properties here. */ });