在MVC视图中显示多对多关系

时间:2016-10-17 16:14:15

标签: c# sql asp.net-mvc database model-view-controller

我正在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的记录?

2 个答案:

答案 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);

    }