2010-01-06 37 views
5

tengo las dos tablas siguientes (esquema básico):Visualización de datos de varias tablas en una vista en forma de lista - ASP.Net MVC

Tbl_CategoryType

ID LevelID Descripción

Tbl_Levels ID Nombre

Básicamente, quiero presentar toda la información en la tabla Tbl_CategoryType al hacer referencia a los datos Tbl_Levels.Name basado en el número Tbl_CategoryType.LevelID.

He intentado utilizar una unión en mi repositorio como a continuación;

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

Sin embargo, cuando llamo a ese método no existe un tipo que puedo asignarlo a medida que no encaja en el tipo de ya sea la categoría o nivel.

Supongo que tengo que hacer esto a través de un modelo de vista personalizado, pero no puedo entender los pasos.

Gracias de antemano

Respuesta

3

Si existe una asociación entre las dos entidades, puede acceder al segundo tipo utilizándola. Lo único que debe hacer en ese caso es usar el método Include() para cargar los datos de la asociación.

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

Que por cada LU_LST_CategoryTypeSet category puede llamar category.LU_LST_Level

+1

Gracias, eso funcionó. – shif

4

Mediante el uso de esta línea en su declaración de LINQ:

select new {x, y} 

va a crear un nuevo tipo anónimo , que es un tipo diferente de sus tipos de entidad.

Supongo que no está utilizando EntityFramework u otro marco pesado que resolverá automáticamente las relaciones de claves foráneas para crear entidades vinculadas. Si es verdadero, entonces sí, deberá crear un ViewModel.

Solo crea una clase contenedora simple que contenga una de cada entidad como una propiedad.

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

Luego, en su declaración de LINQ, en lugar de crear los tipos anónimos, crear tipos MyViewModel:

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

luego copiar los resultados en las clases del modelo:

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

Haga su Ver hereda de MyViewModel.

+0

Esto no funcionará. Debe crear un tipo anónimo y luego copiar los datos a la colección MyViewModel. – LukLed

+0

Oh, sí parece que su método quiere un IQueryable. Gracias por el lugar. – womp

+0

Lo siento, olvidé mencionar que estaba usando Entity Framework. – shif

Cuestiones relacionadas