组合来自多个表的数据以在MVC视图中显示

时间:2015-10-06 18:03:49

标签: c# asp.net-mvc razor viewmodel

我的MVC项目中有两个单独的模型

[Table("Table1")]   
 public class Companies : IEnumerable
 {      
     [Key]
    public double ID { get; set; }
    public System.Guid Key { get; set; }
    public string Name { get; set; }
    public string Company { get; set; }
    public string Industry { get; set; }
    public string Rank{ get; set; }


    public IEnumerator GetEnumerator()
    {
        yield return this.ID;
        yield return this.Key;
        yield return this.Name;
        yield return this.Company;
        yield return this.Industry;
        yield return this.Rank;

    }
 }

[Table("Table2")]
 public class Registration : IEnumerable
 {
    [Key]
    public System.Guid Key { get; set; }
    public string FieldValue{ get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }


    public IEnumerator GetEnumerator()
    {
        yield return this.Key;
        yield return this.FieldValue;
        yield return this.StartDate;
        yield return this.EndDate;

     }
  }

我需要在视图中显示数据组合:

SELECT t2.FieldValue, t1.Name, t1.Company, t1.Industry, t1.Rank 
FROM Table1 as t1 INNER JOIN Table2 as t2 ON t1.Key=t2.Key

我创建了以下Context类:

public class TablesContext: DbContext
{
    public DbSet<Companies> companies { get; set; }
    public DbSet<Registration> registration { get; set; }
}

现在,我可以使用以下代码将公司的数据从控制器传递到视图:

private TablesContext tc = new TablesContext();
 var comps = (from c in tc.companies                                 
                    join r in tc.registry
                    on c.Key equals r.Key
      select new { FieldValue=r.FieldValue, Name=c.Name, Company=c.Company,Industry=c.Industry, Rank=c.Rank});
 return View(comps);

现在我有点卡住尝试使TablesContext类可枚举并循环遍历View中的结果集。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:4)

你通常(可能)进入ASP.NET MVC的方式是你创建一个像这样的ViewModel:

$scope.$new(true)

然后,您可以创建一个public class CompanyRegViewModel{ public string FieldValue {get;set;}; public string Name {get;set;}; public string Company {get;set;}; public string Industry {get;set;}; public string Rank {get;set;}; } 类的实例,而不是创建一个匿名对象:

CompanyRegViewModel

另一方面,您要创建一个视图,其模型是var comps= ..... select new CompanyRegViewModel{ FieldValue=r.FieldValue, Name=c.Name....}; 的列表。 (不一定是List&lt;&gt;。它可以是任何实现IEnumerable&lt;&gt;)的东西。以下是您可能的视图的示例部分:

CompanyRegViewModel

答案 1 :(得分:1)

创建一个VIEW MODEL,即另一个包含两个表所需字段的类。然后使用数据加载它,将其放入LIST并将其传递给View。然后你可以使用foreach很容易地遍历它。

这里很好地解释了

https://stackoverflow.com/a/10020862/3777098

祝你好运

答案 2 :(得分:1)

您需要创建一个视图模型 - 请参阅下面的示例:
另外,在完成使用后,尝试使用using语句来处理上下文。

public class CompanyRegistrationModel
{
    public string FieldValue { get; set; }
    public string Name { get; set; }
    public string Company { get; set; }
    public string Industry { get; set; }
    public string Rank { get; set; }

    public CompanyRegistrationModel Get()
    {
        using (TablesContext tc = new TablesContext())
        {

        var comps = (from c in tc.companies
            join r in tc.registry
                on c.Key equals r.Key
            select
                new CompanyRegistrationModel
                {
                    FieldValue = r.FieldValue,
                    Name = c.Name,
                    Company = c.Company,
                    Industry = c.Industry,
                    Rank = c.Rank
                }).ToList();
        return comps;
        }
    }
}