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