连接两个表并返回一个DbSet对象

时间:2016-09-18 23:22:30

标签: c# asp.net-mvc entity-framework join

在我的IdentityModels类中,我有一个名为Reports的属性,如下面的

    public DbSet<Report> Reports { get; set; }

在我的数据库中,有一个具有相同名称的表,该属性从中提取数据。

我还有一个名为Report的模型(除了一些其他属性)还有这些

public class Report
{
    //...
    [Required]
    public string State { get; set; }

    [Column("reporter_id")]
    public string ReporterId { get; set; }

    [Required]
    [Column("report_text")]
    public string ReportText { get; set; }
    //...
}

我还有一个视图,它是一个以Report为模型的强大视图。

我遇到问题的地方是我的模型有reporterId,它是具有用户详细信息的名为AspNetUsers的不同表的外键。

我想显示用户名而不是id,因为Reports表只有userId,所以我无法显示用户名。

user_name表格中的AspNetUsers字段作为模型的一部分会有什么好方法?显然,join表和reports表之间必须有aspNetUsers语句,但我不确定如何最好地执行此操作。

2 个答案:

答案 0 :(得分:1)

您必须更改模型,如下所示。

    public class Report
    {
        [Required]
        public string State { get; set; }

        [ForeignKey("UserId")]
        public virtual AspNetUser { get; set; }
        public int UserId { get; set; }

        [Required]
        [Column("report_text")]
        public string ReportText { get; set; }

    }

  public class AspNetUser
    {
      public int Id { get; set; }

      public string Name { get; set; }

      public virtual ICollection<Report> Reports { get; set;} 
   }

您的查询应该是这样的:

var query =
(from u in db.AspNetUsers
from r in u.Reports
select new { UserName = u.Name, ReportText = r.ReportText }).ToList();

答案 1 :(得分:1)

我的回答可能对您没有帮助,但我仍会发布,ViewModel专门用于这种情况,您需要在视图中显示两个或更多表数据。

首先,您需要创建一个ViewModel,让我们调用它UserReportViewModel。在此视图模型中,您将添加一个其他属性UserName,该属性将根据ReporterId提取用户名。

public class UserReportViewModel
{
    [Required]
    public string State { get; set; }

    [Column("reporter_id")]
    public string ReporterId { get; set; }

    [Required]
    [Column("report_text")]
    public string ReportText { get; set; }

    public string UserName{ get; set; }
}

然后,假设您使用LINQ检索报告:

Dim ReportList As List(Of UserReportViewModel) = New List(Of UserReportViewModel)
ReportList = dbContext.Reports.Select(Function(x) New UserReportViewModel With {
                                                        .State = x.State, _
                                                        .ReporterId= x.ReporterId, _
                                                        .UserName= dbContext.Users.Find(x.ReporterId).UserName, _
                                                        .ReportText = x.ReportText, _
                                                  }).ToList()