La mayoría de las aplicaciones se centran en datos; sin embargo, la mayoría de los almacenes de datos son bases de datos relacionales. A lo largo de los años, los diseñadores y desarrolladores han diseñado aplicaciones basadas en el modelo de objetos.
Los objetos son responsables de conectar los componentes que acceden a los datos, lo que se denomina capa de acceso a datos (DAL). Aquí debemos considerar tres puntos:
No es necesario almacenar todos los datos requeridos por una aplicación en un solo recurso. Este recurso puede ser una base de datos relacional, un objeto comercial, un archivo XML o un servidor WEB.
Acceder a objetos en la memoria es más sencillo y económico que acceder a datos en bases de datos y archivos XML.
Los datos a los que se accede no se utilizan directamente, sino que se vuelcan, ordenan, agrupan, modifican, etc.
Por lo tanto, sería muy útil si existieran herramientas que pudieran integrar fácilmente todo tipo de datos con solo unas pocas líneas de código, herramientas que pudieran integrar datos de diferentes fuentes y poder realizar operaciones básicas con datos.
Language Integrated Query (LINQ) es una de esas herramientas. LINQ es una extensión de .NET Framework 3.5 y su lenguaje de administración hace que las consultas se parezcan más a objetos. Define una sintaxis común y un modelo de programa que nos permite utilizar una sintaxis idiomática para completar la búsqueda de diferentes tipos de datos.
En LINQ se pueden utilizar operaciones relacionadas como búsqueda, proyecto, vínculo, grupo, partición, configuración, etc., y los compiladores de C# y VB en .NET Framework 3.5 admiten la sintaxis de LINQ, lo que le permite almacenar datos de configuración, sin recurrir a ADO.NET.
Por ejemplo, para consultar la tabla Consumidores en la base de datos Northwind, usando LINQ en C#, el código debe ser el siguiente:
var datos = de c en dataContext.Clientes donde c.País == "España" seleccione c;
en:
La palabra clave from pasa lógicamente por cada colección en secuencia.
Las expresiones que contienen la palabra clave donde comparan cada objeto de la colección.
La declaración de selección seleccionará el objeto comparado, lo agregará a la lista y lo devolverá.
La palabra clave var se utiliza para la declaración de variables. Debido a que el tipo exacto del objeto devuelto no está claro, indica que la información debe inferirse dinámicamente.
Las declaraciones de consulta LINQ se pueden aplicar a cualquier clase compatible con datos que herede de IEnumerable, donde T puede ser cualquier tipo de datos, como Lista<Libro>.
Veamos un ejemplo para entender el concepto. En el ejemplo se utiliza la siguiente clase: Book.cs
Libros de clase pública {ID de cadena pública {obtener; establecer;} Título de cadena pública {obtener; establecer} Precio decimal público {obtener} FechaHora pública {obtener; Lista<Libros> lista = nueva Lista<Libros>(); lista.Agregar(nuevos Libros { ID = "001", Título = "Programación en C#", Precio = 634,76 m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "002", Título = "Aprende Jave en 30 días", Precio = 250,76 m, DateOfRelease = Convert.ToDateTime ("2011-08-15") }); list.Add(libros nuevos {ID = "003", Título = "Programación en ASP.Net 4.0", Precio = 700,00 m, DateOfRelease = Convert.ToDateTime("2011-02-05") }); list.Add(new Books { ID = "004", Título = "VB.Net simplificado", Precio = 500,99 millones, Fecha de lanzamiento = Convert.ToDateTime("2011-12-31") }); list.Add(new Books { ID = "005", Título = "Programación en C", Precio = 314,76 millones, DateOfRelease = Convert.ToDateTime("2010- 02-05") }); list.Add(libros nuevos { ID = "006", Título = "Programación en C++", Precio = 456,76 millones, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "007", Título = "Desarrollo de la base de datos", Precio = 1000,76 millones, DateOfRelease = Convert.ToDateTime("2010-02-05") }); lista; }}
Utilice esta clase en una página web para tener un control de etiqueta simple para mostrar el título del libro. El método Page_Load crea una lista de libros y devuelve los títulos mediante una consulta LINQ:
consulta simple de clase parcial pública: System.Web.UI.Page{ protected void Page_Load(remitente del objeto, EventArgs e) { List<Books> books = Books.GetBooks(); from b in books select b.Title foreach (; var título en títulos de libros) lblbooks.Text += String.Format("{0} <br />", título }}
Cuando se ejecuta la página web, la etiqueta muestra los resultados de la consulta:
La expresión LINQ anterior:
var booktitles = de b en libros seleccione b.Title;
Equivalente a la siguiente declaración SQL:
SELECCIONAR Título de Libros
Además de los operadores utilizados hasta ahora, existen muchos otros operadores para ejecutar cláusulas de consulta. Veamos algunos operadores y cláusulas.
La 'cláusula de unión' en SQL se utiliza para unir dos tablas de datos y mostrar una colección de datos en columnas que aparecen en ambas tablas de datos. LINQ también puede admitir esta funcionalidad. Para comprobar esto, agregue otra clase llamada Saledetails.cs al proyecto anterior:
detalles de ventas de clase pública {ventas int públicas {obtener; detalles de ventas> públicas int {obtener} ID de cadena pública {obtener; detalles de ventas {nuevos ID = "001", páginas = 678, ventas = 110000}, nuevos detalles de ventas {ID = "002", páginas = 789, ventas = 60000}, nuevos detalles de ventas {ID = "003", páginas = 456, ventas = 40000}, nuevos detalles de ventas {ID = "004", páginas = 900, ventas = 80000}, nuevos detalles de ventas {ID = "005", páginas=456, ventas = 90000}, nuevos detalles de ventas {ID = "006", páginas = 870, ventas = 50000}, nuevos detalles de ventas { ID = "007", páginas = 675, ventas = 40000}, };
Agregue código en la función Page_Load para completar la consulta en las dos tablas usando el procesamiento de cláusula de unión:
protected void Page_Load(object sender, EventArgs e){ IEnumerable<Books> books = Books.GetBooks(); IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails(); var booktitles = from b in books join s in sales on b.ID es igual a s.ID select new { Nombre = b.Título, Páginas = s.páginas }; títulos de libros) lblbooks.Text += String.Format("{0} <br />", título);}
La página de resultados se muestra de la siguiente manera:
La cláusula donde permite agregar condiciones de filtrado a la consulta. Por ejemplo, si desea obtener bibliografías con más de 500 páginas, puede cambiar el identificador en el método Page_Load para que se vea así:
var booktitles = de b en libros unirse a s en ventas en b.ID es igual a s.ID donde s.páginas > 500 seleccione nuevo { Nombre = b.Título, Páginas = s.páginas };
La declaración de consulta solo devuelve aquellas columnas con un recuento de páginas superior a 500:
Estas cláusulas permiten ordenar los resultados de la consulta. Para consultar el título, el número de página y el precio del libro, y ordenarlos por precio, escriba el siguiente código en el identificador del método Page_Load:
var booktitles = de b en libros unirse a s en ventas en b.ID es igual a s.ID ordenar por b.Precio seleccione nuevo { Nombre = b.Título, Páginas = s.páginas, Precio = b.Precio};
La tupla devuelta es:
La cláusula let permite definir una variable y asignarle un valor calculado a partir de los datos. Por ejemplo, para calcular el valor total de las ventas a partir de los dos valores de ventas anteriores, debe calcularlo de esta manera:
TotalSale = Precio del Libro * Ventas
Para completar esta ecuación, agregue el siguiente fragmento de código al identificador del método Page_Load:
La cláusula let permite definir una variable y asignarle un valor calculado a partir de los datos. Por ejemplo, para calcular el valor total de las ventas a partir de los dos valores de ventas anteriores, debe calcularlo de esta manera:
var booktitles = from b in book join s in sales on b.ID es igual a s.ID let totalprofit = (b.Price * s.sales) select new { Nombre = b.Title, TotalSale = totalprofit};
Los resultados de la consulta se muestran a continuación: