viernes, 19 de julio de 2013

Asignación de Datos a Entidades con Sintaxis Linq

Introducción :
Siempre que usamos un Entity Framework , si queremos podemos usar o no Linq , aunque generalmente cuando trabajas con este tipo de conexión de datos es optimo usar linq ya que puedes ejecutar las consultas a través del code behind con mayor flexibilidad.
En este post , veremos como realizar una consulta con linq y asignarle valores a las Entidades que usaremos para mostrar nuestra data en los View.

Que es Linq ? 

Lenguaje integrado de consultas, es un componente de .NET , y nos permite realizar consultas en los lenguajes de .NET , en este caso C# con la sintaxis de consultas de sql.
Pueden ver mas información de la Microsoft Microsoft - Sintaxis LINQ

1. Creamos nuestro Entity Framework (para crear un EF puede ver Entity Framework).

2. Creamos el modelo o Entity model , en este caso creare uno para productos.
public class ProductoModel
    {
        public int IdProducto { get; set; }
        public string NombreProducto { get; set; }
        public string NombreProveedor { get; set; }
        public string NombreCategoria { get; set; }
        public string CantidadPorUnidad { get; set; }
        public decimal? PrecioUnidad { get; set; }
    }

3. Luego en el controlador realizamos la consulta con LINQ, tal y como lo harias en SQL.
public class ProductosController : Controller
    {
        NeptunoEntities db = new NeptunoEntities();

        public ActionResult ListaProductos()
        {
            var Listado = from p in db.Productos
                          join pr in db.Proveedores on p.IdProveedor equals pr.IdProveedor
                          join c in db.Categorias on p.IdCategoria equals c.IdCategoria
            return View();
        }

    }


Si te das cuenta , esto es lo mismo que una consulta en SQL.
select 
p.IdProducto,
p.NombreProducto,
pro.NombreCompañia as Proveedor,
c.NombreCategoria,
p.CantidadPorUnidad,
p.PrecioUnidad
from productos p
inner join Proveedores pro on p.IdProveedor= pro.IdProveedor
inner join Categorias c on p.IdCategoria = c.IdCategoria

4.Asignamos los valores a las propiedades del Modelo de la siguiente manera.
public ActionResult ListaProductos()
        {
            var Listado = from p in db.Productos
                          join pr in db.Proveedores on p.IdProveedor equals pr.IdProveedor
                          join c in db.Categorias on p.IdCategoria equals c.IdCategoria
                          select new ProductoModel
                          {
                              IdProducto = p.IdProducto,
                              NombreProducto = p.NombreProducto,
                              NombreProveedor = pr.NombreCompañia,
                              NombreCategoria = c.NombreCategoria,
                              CantidadPorUnidad = p.CantidadPorUnidad,
                              PrecioUnidad = p.PrecioUnidad
                          };
            var Productos = Listado.ToList();
            ViewBag.ListadoProductos = Productos;
            return View(Productos);
        }


Si te das cuenta aqui le asigno mas directamente los valores a las propiedades del modelo ya que el Entity Framework me creo automaticamente las Entidades.

5.Finalmente retornamos los datos a la vista correspondiente.
@{ViewBag.Title = "ListaProductos";}
@using Linq_Entidades.Models;

<h2>ListaProductos</h2>

<table>
<thead>
    <tr>
        <th>IdProducto</th>
        <th>NombreProducto</th>
        <th>Proveedor</th>
        <th>NombreCategoria</th>
        <th>CantidadPorUnidad</th>
        <th>PrecioUnidad</th>
    </tr>
</thead>

<tbody>
@foreach (var p in ViewBag.ListadoProductos as List<ProductoModel>)
    {
    <tr>
        <td>@p.IdProducto</td>
        <td>@p.NombreProducto</td>
        <td>@p.NombreProveedor</td>
        <td>@p.NombreCategoria</td>
        <td>@p.CantidadPorUnidad</td>
        <td>@p.PrecioUnidad</td>
    </tr>
    }
</tbody>
</table>

Espero te haya servido este post, si deseas puedes descargar la solución .


No hay comentarios:

Publicar un comentario