从存储库中读取时如何显示.ToList..我哪里错了

本文关键字:ToList 显示 错了 存储 读取 何显示 | 更新日期: 2023-09-27 18:27:06

由于某些原因,C#不会在我的代码中显示.ToList。我想知道怎么拿到它。

我有一个基本的MVC4应用程序,作为概念验证,我成功地将其分为几个项目。下面是我的图层。。。在我尝试添加域层之前,一切都正常。这就是混乱的开始。所以有些代码:

我的模型是由EF5从数据库中生成的。我有一个标准的"学生"课程,有一个ID和一个名字。这就是全部。它与一门课程有关。一门课程有很多学生。以下是EF生成的内容。

public partial class Student
{
    public int Id { get; set; }
    public Nullable<int> CourseId { get; set; }
    public string Name { get; set; }
    public Nullable<System.DateTime> DateAttended { get; set; }  //This field becomes important later
    public virtual Course Course { get; set; }
}

这是课程模型。

public partial class Course
{
    public Course()
    {
        this.Student = new HashSet<Student>();
    }
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Student> Student { get; set; }
}

我将此提取到一个Models项目中,并在之后对所有内容进行了全面测试。一切顺利,没有问题。

然后,我在它和我的控制器之间添加了一个通用的回购层,以从我的控制器中删除DB访问逻辑。这是接口:

public interface IHeadRepository<TEntity>
{
    ICollection<TEntity> ReadAll(); //I Want to focus here for the problem...
    int Create(TEntity entity);
    TEntity ReadSingle(int id);
    ICollection<TEntity> ReadSome(Expression<Func<TEntity, bool>> predicate);
    int Update(TEntity entity);
    int Delete(TEntity entity);
}

为了简洁起见,我只展示我想重点介绍的部分的实现。。。

public class HeadRepo<TEntity> : IHeadRepository<TEntity> where TEntity : class
{
    protected DbSet<TEntity> dbSet;
    private readonly DbContext dbContext;
    public HeadRepo() { }
    public HeadRepo(DbContext dbContext)
    {
        this.dbContext = dbContext;
        dbSet = dbContext.Set<TEntity>();
    }

    public ICollection<TEntity> ReadAll()
    {
        return dbSet.ToList();
    }
}

在我开始尝试实现我的域层之前,我测试了所有的东西,一切都成功了。因此,我开始实现我的域层,并对我的repo进行了一些更改。

最初界面和回购都是这样的。。。

    public IQueryable<TEntity> ReadAll()
    {
        return dbSet;
    }

这是一个Iquerable而不是ICollection。我尝试了各种各样的改变,IList,IEnumerable等

终于。。。我遇到的问题似乎是我的控制器。。。但我知道这可能是因为我实施回购的方式。但是我不知道如何修复它。

这是我的控制器。。。索引操作。

这是以前的事。效果很好public ActionResult Index(){return View(studentRepo.ReadAll());}

我想做的是添加一个ViewModel,它有一个额外的字段,叫做YearsGraduate。像这样:

public class StudentVM : Student
{
    [Display(Name = "Years Graduated:")]
    public int YearsGraduated { get; set; }
}

然后我想转到我的控制器,使用我的repo读取所有学生,将学生列表分配给我的学生列表VM,然后对他们运行一个简单的方法来计算他们毕业后的年份。所以它在塞米苏多。。。

    public ActionResult Index()
    {
        //I get an error when I do this (the best overloaded...has invalid args)
        //var vm = new List<StudentVM>(studentRepo.ReadAll());
        //So I try this:
        //var vm = new List<StudentVM>();
        //vm = studentRepo.ReadAll(); //I get error here...Cannot implicity comvert...explisit exists
        //So I try this:
        //var vm = new List<StudentVM>();
        //vm = studentRepo.ReadAll().ToList(); //I get error here...No definition / extension method .ToList() can be found
        //So I tried updating my repo interface and changing it from:
        //IQueriable to ICollection
        //ICollection to IEnumerable
        //IEnumerable to IList
        //IList to List
        //Without any success.
        //As explained, if I can get this working, I would like to do something like:
        //
        //var vm = new List<StudentVM>();
        //vm = studentRepo.ReadAll();
        //For(i=0; i<vm.count; i++)
        //{
        //    vm[i].YearsGraduated = CalcYearsExpired(vm[i].DateAttended)
        //}

        //Some method outside this called CalcYearsExpired() which takes a date,
        //returns an int or double and im done.
        //Then the return method changes from this:
        //return View(studentRepo.ReadAll());
        //To something like this:
        //return View("Index", vm);
        //And the view changes accordingly to use the Collection<StudentVM> to list the students.
    }

任何帮助都将不胜感激。。。我的目标是添加一个域层,并在工作时提取这些代码,以便我的控制器保持简单。我在做这件事时遇到了很大的困难,所以很明显,如果我不能先在控制器或回购中本地完成,那么尝试在其他地方完成是没有意义的。我不想把它放在回购中,因为它会使回购变得特定,我想尽量保持通用性。但我的首要任务是解决这个问题,所以如果我必须让回购更加具体,我会的。

从存储库中读取时如何显示.ToList..我哪里错了

是否包含命名空间System.Linq?