我正在MVC中创建一个数据库驱动的应用程序,我的应用程序是一个“数据字典”,它显示报告以及这些报告中使用的数据库表。我正在为MVC使用数据库第一种方法。
我的数据库结构如下
*tblReport*
fldReportID
fldReportName
fldReportPurpose
fldOriginalSignOffDate
*tblDBTables*
fldTableID
fldTableName
*tblDBTablesUsed*
fldDBTablesUsedID
fldReportID
fldTableID
tblDBTablesUsed是多对多链接表IE,每个报告都有很多表,每个表都可以在很多报告中使用。
我想在MVC中创建一个显示基本报告信息(在tblReport中保存)的视图页面,以及有关该报告中使用的表的信息。
我为每个表创建了一个模型,如下所示:
public partial class tblReport
{
public int fldReportID { get; set; }
public string fldReportName { get; set; }
public string fldReportPurpose { get; set; }
public Nullable<System.DateTime> fldOriginalSignOffDate { get; set; }
}
public partial class tblDBTable
{
public int fldTableID { get; set; }
public string fldTableName { get; set; }
}
public partial class tblDBTablesUsed
{
public int fldTablesUsedID { get; set; }
public Nullable<int> fldReportID { get; set; }
public Nullable<int> fldTableID { get; set; }
public virtual tblDBTable tblDBTable { get; set; }
public virtual tblReport tblReport { get; set; }
}
和我的Dbcontext类:
public partial class DataDictionaryEntities : DbContext
{
public virtual DbSet<tblDBTable> tblDBTables { get; set; }
public virtual DbSet<tblDBTablesUsed> tblDBTablesUseds { get; set; }
public virtual DbSet<tblReport> tblReports { get; set; }
}
我创建了一个viewmodel来保存我想在视图中显示的两个实体:
public class ReportViewModel
{
public tblReport report = new tblReport();
public IEnumerable<tblDBTable> dbtables;
}
最后,在我的报告控制器中,我创建了详细信息操作方法
public ActionResult Details(int? id)
{
ReportViewModel rvm = new ReportViewModel();
tblReport Report = db.tblReports.Find(id);
//here we have an Ienumerable of the link table which gives us the table ID's used in this report
IEnumerable<tblDBTablesUsed> DBTablesUsed = db.tblDBTablesUseds.Where(x => x.fldReportID == Report.fldReportID);
//how to get the tables!?
//DBTables = ??
rvm.report = Report;
rvm.dbtables = DBTables;
return View(rvm);
}
我正在努力获取相关的表 - IEnumerable DBTablesUsed保存了他们的ID,但是如何从tblReport获取那些IDS的记录?
答案 0 :(得分:0)
如果我理解正确,你想要得到多对多助手表的所有孩子 您可以做的是获取所有tblDBTablesUsed并使用它们来使用.Contains()来获取tblDBTable和tblReports。
public ActionResult Details(int? id)
{
ReportViewModel rvm = new ReportViewModel();
tblReport Report = db.tblReports.Find(id);
List<tblDBTablesUsed> DBTablesUsed = db.tblDBTablesUseds
.Where(x => x.fldReportID == Report.fldReportID).ToList(); //execute DB query using ToList()
List<tblReport> reports = db.tblReports
.Where(rep => DBTablesUsed.Select(x => x.fldReportID).Contains(rep.fldReportID))
.ToList();
List<tblDBTable> tables= db.tblDBTables
.Where(rep => DBTablesUsed.Select(x => x.fldTableName).Contains(rep.fldTableName))
.ToList();
rvm.report = reports;
rvm.dbtables = tables;
return View(rvm);
}
顺便说一句,你有可怕的命名约定,并且你没有遵循任何c#命名风格,这使你的代码难以阅读。
答案 1 :(得分:0)
感谢Camilo的帮助。
我设法得到解决方案:
public ActionResult Details(int? id)
{
ReportViewModel rvm = new ReportViewModel();
tblReport report = db.tblReports.Find(id);
List<tblDBTable> tablesinreport = new List<tblDBTable>();
// get tables used in this report
IQueryable<tblDBTable> ReportTables = from t1 in db.tblDBTablesUseds
join t2 in db.tblDBTables on t1.fldTableID equals t2.fldTableID
where t1.fldReportID == id
select t2;
tablesinreport= ReportTables.ToList();
rvm.report = report;
rvm.dbtables = tablesinreport;
return View(rvm);
}