gpt4 book ai didi

c# - 如何以存储库模式读取 iCollection 数据 - ASP.NET- MVC Entity Framework

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:44 24 4
gpt4 key购买 nike

我在我的 ASP.NET-MVC 应用程序中使用存储库模式和工作单元。我在工作单元和 Controller 类之间有用于 CRUD 操作和服务类的通用存储库;这意味着 Controller 类调用工作单元来访问所有操作,这非常适合从 Web 应用程序封装数据访问和业务逻辑。

现在我的问题是如何在工作单元内获取 icollection 数据。以下面的例子

enter image description here

学生模型

 public partial class Student
{
public Student()
{
this.StudentCourses = new HashSet<StudentCourse>();
}

public int StudentID { get; set; }
public string Name { get; set; }

public virtual ICollection<StudentCourse> StudentCourses { get; set; }
}

类(class)模型

public partial class Course
{
public Course()
{
this.StudentCourses = new HashSet<StudentCourse>();
}

public int CourseID { get; set; }
public string Title { get; set; }

public virtual ICollection<StudentCourse> StudentCourses { get; set; }
}

学生类(class)模型

 public partial class StudentCourse
{
[Key]
public int StudentCourseID { get; set; }

[Key]
[ForeignKey("Student")]
public int StudentID { get; set; }

[Key]
[ForeignKey("Course")]
public int CourseID { get; set; }

public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
}

我如何使用存储库模式和工作单元实现以下 LINQ 查询结果。我很挣扎,因为通用存储库类只给学生记录而不是类(class),除非我在这里遗漏了什么。我使用的数据注释不是流利的 API

 using (var db2 = new MyDbContext())
{
List<Student> _studentRead = new List<Student>();

_studentRead = (from _student in db2.Students
.Include(r => r.StudentCourses.Select(sc => sc.Course))
select _student).ToList();

}

通用存储库接口(interface)

 public interface IGenericRepository<TEntity> where TEntity :class
{

global::System.Linq.IQueryable<TEntity> GetAll();
TEntity GetEntityByID(int id);
void InsertEntity(TEntity obj);
void UpdateEntity(TEntity obj);
void DeleteEntity(int id);
}

通用存储库

 public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
{
protected DbSet<TEntity> _DbSet;
private readonly DbContext _dbContext;

public GenericRepository()
{ }

public GenericRepository(DbContext dbContext)
{
this._dbContext = dbContext;
_DbSet = _dbContext.Set<TEntity>();
}

public IQueryable<TEntity> GetAll()
{
return _DbSet;
}

public TEntity GetEntityByID(int id)
{
TEntity obj = _DbSet.Find(id);
return obj;
}

public void InsertEntity(TEntity obj)
{
_DbSet.Add(obj);
}

public void UpdateEntity(TEntity obj)
{
_dbContext.Entry(obj).State = EntityState.Modified;
}

public void DeleteEntity(int id)
{
TEntity obj = _DbSet.Find(id);
_DbSet.Remove(obj);
}

}

最佳答案

要获得类(class),您只需执行以下操作:

var repository = new GenericRepository<Course>();
var courses = repository.GetAll();

然后在您可以做的那些类(class)中使用 linq:

var courses = from c in repository.GetAll()
select c;

var courses = from c in repository.GetAll()
where c.StudentCourses.StudentId == 1234
select c;

甚至:

var courses = repository.GetAll();
var studentCourses = from c in courses
where c.StudentCourses.StudentId == 1234
select c;

这与:

var courses = repository.GetAll();
var studentCourses = courses.Where(x => x.StudentCourses.StudentId == 1234);

希望这对您有所帮助,如果没有评论并更具体地说明您正在努力实现的目标。

关于c# - 如何以存储库模式读取 iCollection 数据 - ASP.NET- MVC Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30184449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com