0

In meinem ASP.NET Core 1.1 mit EF Core 1.1 app, habe ich ein Szenario ähnlich dem folgenden: Parent Tabelle PT und Kind Tabelle CH haben 1-1 FK-Beziehung. Wir müssen einige Spalten aus bestimmten Datensätzen aus der Tabelle PT und ein paar Spalten aus den zugehörigen Datensätzen aus der Tabelle CH abrufen. Frage: Wie kann ich diese Datensätze mit der folgenden LINQ-Abfrage in die folgenden ViewModel laden? Hinweis: Ich habe es kann mit regulären LINQ getan usw. Join aber war neugierig, wie wir es tun können mit Eager LoadingEF-Core Eager Loading zu einem ViewModel

Ansichtsmodell:

public class PT_CH_ViewModel 
{ 
Public int PTCol1 {get; set;} 
Public string PTCol1 {get; set;} 
Public float PTCol1 {get; set;} 
.... 
Public int CHCol1 {get; set;} 
Public string CHCol2 {get; set;} 
.... 
} 

Controller: Need PT_CH_ViewModel hier laden und geben Sie es als Liste zurück

.... 
PT pt = _context.PT 
       .Include(p => p.CH) 
       .Where(p => p.PTcol == selectedID); 
.... 
return View(???); 
+0

Hallo, können Sie AutoMapper verwenden. – Houtan

Antwort

1

Sie müssen eine Navigationseigenschaft für yo haben Ihre CH-Einheit. Sobald Sie eifrig geladen sind, können Sie auf den Inhalt der Navigationseigenschaft zugreifen.

public class PT 
{ 
    public int Col1 { get; set; } 
    ... 
    public virtual CH CH { get; set; } // optional, do not put [Required] attribute 
} 

public CH 
{ 
    public int Col1 { get; set; } 
    ... 
    [Required] // CH table needs PT table for the 1-1 relationship 
    public PT PT { get; set; } 
} 


PT_CH_ViewModel viewModel = new PT_CH_ViewModel() 
{ 
    PTCol1 = pt.Col1, 
    PTCol2 = pt.Col2, 
    PTCol3 = pt.Col3, 
    CHCol1 = pt.CH.Col1, 
    CHCol2 = pt.CH.Col2 
}; 


return View(viewModel); 

Da Sie es als eine Liste benötigen, können Sie so etwas wie:

var pts = _context.PT 
       .Include(p => p.CH) 
       .Where(p => p.PTcol == selectedID) 
       .Select(pt => new PT_CH_ViewModel() 
       { 
        PTCol1 = pt.Col1, 
        PTCol2 = pt.Col2, 
        PTCol3 = pt.Col3, 
        CHCol1 = pt.CH.Col1, 
        CHCol2 = pt.CH.Col2 
       }).ToList(); 

return View(pts); 

Ausblick:

@model List<PT_CH_ViewModel> 
+0

Im letzten Block deines Codes: 1) meinst du 'p.col1, ... etc.' und nicht' pt.col1 ... usw.' 2) Muss ich noch ToList() auf 'anwenden pts' oder 'pts' wird eine Liste selbst sein? – nam

+0

@nam es wird ein 'IEnumerable' zurückgeben. Sie können 'ToList()' verwenden, wenn Sie das brauchen. Ich wollte 'pt =>' anstelle von 'p =>' verwenden. Bearbeitet. –

Verwandte Themen