【问题标题】:Joining two tables and returning a DbSet object连接两个表并返回一个 DbSet 对象
【发布时间】:2017-01-26 13:48:48
【问题描述】:

在我的 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; }
    //...
}

我还有一个以报表为模型的强视图。

我遇到的一个问题是我的模型有 reportId,它是另一个名为 AspNetUsers 的表的外键,其中包含用户详细信息。

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

AspNetUsers 表中的user_name 字段成为我模型的一部分的好方法是什么?在reports 表和aspNetUsers 表之间显然必须有一个join 语句,但我不确定如何最好地做到这一点。

【问题讨论】:

  • 你能不能也放一个 `AspNetUsers' 模型?
  • 你没有把userId 也放在Report 模型上?
  • 我的 Report 模型中有用户 ID(属性称为 ReporterId),但我需要使用“AspNetUsers”表中的“用户名”,因为我想在用户名中显示的不是用户 ID
  • 哦..你为什么不能把它写成userId呢?它给人的印象不是吗?
  • @Sampath 我将需要一个用户模型,你也是正确的,但是我将如何将报告和用户对象绑定到视图?现在我的观点与@model IEnumerable&lt;Proj.Models.Report&gt;

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


【解决方案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()

【讨论】:

    【解决方案2】:

    你必须改变你的模型,如下所示。

        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();
    

    【讨论】:

    • 抱歉,我到底在哪里使用 LINQ 查询?
    • 我没听懂你?你改变了你的模型如上所示?
    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多