2010-01-06 8 views
5

habe ich die folgenden zwei Tabellen (Grundzüge):Daten aus mehreren Tabellen in einer Ansicht als Liste angezeigt - ASP.Net MVC

Tbl_CategoryType

ID LevelID Beschreibung

Tbl_Levels ID Name

Grundsätzlich möchte ich alle Informationen in der Tbl_CategoryType-Tabelle während der Verweis auf die Tbl_Levels.Name Daten darstellen basierend auf der Tbl_CategoryType.LevelID-Nummer.

Ich habe versucht, einen Join in meinem Repository als unten zu verwenden;

public IQueryable GetAllTypesInCategory(int CatID) 
{ 
    return (from x in DBEntities.LU_LST_CategoryTypeSet 
      where x.CategoryID == CatID && x.Enabled == 1 
      join y in DBEntities.LU_LST_LevelSet on x.LevelID equals y.ID 
      select new {x, y}); 
} 

Allerdings, wenn ich diese Methode es nennen, ist kein Typ I zuweisen kann, wie es passt nicht in die Art der entweder der Kategorie oder Stufe.

Ich gehe davon aus, dass ich dies über ein benutzerdefiniertes Ansichtsmodell tun muss, kann aber die Schritte nicht herausfinden.

Vielen Dank im Voraus

Antwort

3

Wenn zwischen den beiden Entitäten eine Zuordnung besteht, können Sie auf den zweiten Typ zugreifen, der sie verwendet. In diesem Fall müssen Sie nur die Include() -Methode zum Laden der Zuordnungsdaten verwenden.

 public List<LU_LST_CategoryType> GetAllTypesInCategory(int CatID) 
     { 
      return (from x in DBEntities.LU_LST_CategoryTypeSet.Include("LU_LST_LevelSet") 
        where x.CategoryID == CatID && x.Enabled == 1 
        select x).ToList(); 
     } 

als jeder für LU_LST_CategoryTypeSet category können Sie anrufen category.LU_LST_Level

+1

Danke, das hat funktioniert. – shif

4

Durch diese Zeile in Ihrer Linq-Anweisung:

select new {x, y} 

Sie einen neuen anonymen Typen zu schaffen, das eine andere Art von Ihrem Entity-Typ ist.

Ich schätze, Sie verwenden nicht EntityFramework oder ein anderes schweres Framework, das automatisch Fremdschlüsselbeziehungen auflöst, um verknüpfte Entitäten zu erstellen. Wenn ja, müssen Sie ein ViewModel erstellen.

Erstellen Sie einfach eine einfache Wrapper-Klasse, die jeweils eine Entität als Eigenschaft enthält.

public IQueryable GetAllTypesInCategory(int CatID) 
{ 
    return (from x in DBEntities.LU_LST_CategoryTypeSet 
      where x.CategoryID == CatID && x.Enabled == 1 
      join y in DBEntities.LU_LST_LevelSet on x.LevelID equals y.ID 
      select new {x, y}); 
} 

dann die Ergebnisse in Ihre Modellklassen kopieren:

public class MyViewModel 
{ 
    public MyViewModel(LU_LST_CategoryTypeSet x, LU_LST_LevelSet y) 
    { 
     Category = x; 
     Level = y; 
    } 

    public LU_LST_CategoryTypeSet Category { get; set;} 
    public LU_LST_LevelSet Level { get; set; } 
} 

Dann in Ihrer Aussage Linq, statt anonyme Typen zu schaffen, MyViewModel Typen erstellen

var listOfTypes = GetAllTypesInCategory(catID); 
    foreach (var item in listOfTypes) 
    { 
     var model = new MyViewModel(item.x, item.y); 

     //Do whatever with the model to get it to the view. 
    } 

Machen Sie Ihre Ansicht vererben von MyViewModel.

+0

Das wird nicht funktionieren. Sie müssen einen anonymen Typ erstellen und dann Daten in die MyViewModel-Auflistung kopieren. – LukLed

+0

Oh, ja sieht aus wie seine Methode ein IQueryable will. Danke für den Spot. – womp

+0

Es tut mir leid, dass ich vergessen habe zu erwähnen, dass ich das Entity Framework verwendet habe. – shif