2016-09-18 1 views
1

In meiner IdentityModels Klasse habe ich eine Eigenschaft namens Berichte wie untenZwei Tabellen und Zurückgeben ein DbSet Objekts

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

In meiner Datenbank eine Tabelle mit dem gleichen Namen gibt, das diese Eigenschaft aus, die Daten zieht.

Ich habe auch ein Modell genannt, dass Report (neben einigen anderen Eigenschaften) diese

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

hat Ich habe auch eine Ansicht, die eine starke Ansicht mit Bericht als Modell.

Wo ich auf ein Problem stieß, ist, dass mein Modell ReporterId hat, die ein Fremdschlüssel für verschiedene Tabelle namens AspNetUsers ist, die die Benutzerdetails hat.

Ich möchte den Benutzernamen nicht die ID anzeigen und da die Berichte Tabelle nur die userId hat, gibt es keine Möglichkeit für mich, den Benutzernamen anzuzeigen.

Was wäre eine gute Möglichkeit, ein user_name Feld in der AspNetUsers Tabelle Teil meines Modells zu machen? Es muss offensichtlich eine join Aussage irgendwo zwischen der reports Tabelle und aspNetUsers Tabelle sein, aber ich bin nicht sicher, wie man das am besten macht.

+0

können Sie auch ein 'AspNetUsers' Modell setzen? – Sampath

+0

Sie haben 'userId' auch nicht auf' Report' Modell gesetzt? – Sampath

+0

Ich habe userId (Eigenschaft namens 'ReporterId') in meinem' Report' Modell, aber ich muss 'userName' von 'AspNetUsers' Tabelle verwenden, da was ich im Benutzernamen nicht Benutzer-ID anzeigen möchte –

Antwort

1

Meine Antwort auf Sie kann nicht hilfreich sein, aber ich bin wird es noch veröffentlichen, werden Ansichtsmodell speziell für diese Art von Situation verwendet, wo Sie brauchen um zwei oder mehr Tabellendaten in einer Ansicht anzuzeigen.

Zuerst müssen Sie ein ViewModel erstellen, rufen Sie es UserReportViewModel. In diesem Ansichtsmodell fügen Sie eine zusätzliche Eigenschaft ein, die den Benutzernamen basierend auf ReporterId abruft.

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; } 
} 

Dann vorausgesetzt, Sie LINQ verwenden den Bericht abzurufen:

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

Sie müssen Ihre Modelle wie unten gezeigt ändern.

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;} 
    } 

Ihre Abfrage sollte wie folgt sein:

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

Entschuldigung, wo genau verwende ich die LINQ-Abfrage? –

+0

Ich habe dich nicht bekommen? hast du deine modelle wie oben gezeigt geändert? – Sampath

Verwandte Themen