Tag Archives: linq

LinQ – consultas

26 Nov

LINQ o Language Integrated Query es un conjunto herramientas de Microsoft para realizar todo tipo de consultas a distintas fuentes de datos: objetos, xmls, bases de datos, etc… Para ello, usa un tipo de funciones propias, que unifica las operaciones más comunes en todos los entornos, con esto, se consigue un mismo lenguaje para todo tipo de tareas con datos.

En este artículo voy a dejar un ejemplo de cómo utilizar este tipo de consultas, que aunque es un poco lioso al principio se puede llegar a entender.

Aunque no es necesario, es mejor tener alguna noción de SQL, pero no es imprescindible.

A estas alturas, todos sabemos lo que es una clase y como se usa, para este ejemplo vamos a trabajar con una clase ENAcuerdo, definida a continuación

Imports System

Imports System.Collections.Generic

Imports System.Text

Namespace EntidadesNegocio.Administracion

”’ <summary>

”’ EDAcuerdo  – Acuerdos para procuradores.

”’ </summary>

”’ <remarks></remarks>

<Serializable()> _

Partial Public Class ENAcuerdo

Public Sub New()

MyBase.New()

End Sub

Private m_Pk As Nullable(Of Integer)

Private m_Fechainicio As Nullable(Of Date)

Private m_Fechafin As Nullable(Of Date)

”’ <summary>

”’ Identificador único del acuerdo.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Pk() As Nullable(Of Integer)

Get

Return m_Pk

End Get

Set(ByVal value As Nullable(Of Integer))

m_Pk = value

End Set

End Property

”’ <summary>

”’ Fecha de entrada en vigencia del acuerdo.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Fechainicio() As Nullable(Of Date)

Get

Return m_Fechainicio

End Get

Set(ByVal value As Nullable(Of Date))

m_Fechainicio = value

End Set

End Property

”’ <summary>

”’ Fecha de fin de vigencia del acuerdo.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Fechafin() As Nullable(Of Date)

Get

Return m_Fechafin

End Get

Set(ByVal value As Nullable(Of Date))

m_Fechafin = value

End Set

End Property

End Class

End Namespace

Recordamos que las clases deben estar organizadas en espacios de nombres para que sea más fácil su localización y tener una idea de para que son.

Linq lo utilizamos para consultas, así que necesitamos una colección que contenga más de una entidad…

Namespace ColeccionesNegocio.Administracion

”’ <summary>

”’ Colección negocio ENAcuerdo – Acuerdos para procuradores.

”’ </summary>

”’ <remarks></remarks>

Public Class CNAcuerdo

Inherits System.Collections.CollectionBase

Implements ICollection(Of

EntidadesNegocio.Administracion.ENAcuerdo)

Public Function ToList() As List(Of

EntidadesNegocio.Administracion.ENAcuerdo)

Return List.Cast(Of

EntidadesNegocio.Administracion.ENAcuerdo).ToList

End Function

Public Function Item(ByVal index As Integer) As

EntidadesNegocio.Administracion.ENAcuerdo

Return List.Item(index)

End Function

Public Sub Add(ByVal item As EntidadesNegocio.Administracion.ENAcuerdo) Implements System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).Add

List.Add(item)

End Sub

Shadows Sub Clear1() Implements System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).Clear

List.Clear()

End Sub

Public Function Contains(ByVal item As EntidadesNegocio.Administracion.ENAcuerdo) As Boolean Implements

System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).Contains

Return List.Contains(item)

End Function

Public Sub CopyTo(ByVal array() As EntidadesNegocio.Administracion.ENAcuerdo, ByVal arrayIndex As

Integer) Implements System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).CopyTo

List.CopyTo(array, arrayIndex)

End Sub

Shadows ReadOnly Property Count1() As Integer Implements System.Collections.Generic.ICollection(Of

EntidadesNegocio.Administracion.ENAcuerdo).Count

Get

Return List.Count

End Get

End Property

Public ReadOnly Property IsReadOnly() As Boolean Implements System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).IsReadOnly

Get

Return List.IsReadOnly

End Get

End Property

Public Function Remove(ByVal item As EntidadesNegocio.Administracion.ENAcuerdo) As Boolean Implements

System.Collections.Generic.ICollection(Of EntidadesNegocio.Administracion.ENAcuerdo).Remove

If List.Contains(item) Then

List.Remove(item)

Return True

Else

Return False

End If

End Function

Shadows Function GetEnumerator1() As System.Collections.Generic.IEnumerator(Of EntidadesNegocio.Administracion.ENAcuerdo) Implements System.Collections.Generic.IEnumerable(Of EntidadesNegocio.Administracion.ENAcuerdo).GetEnumerator

Return List.GetEnumerator

End Function

End Class

End Namespace

Ya tenemos una colección, ahora hagamos un ejemplo sencillo de los de internet.

Supongamos que queremos recuperar los acuerdos en que la fecha de inicio sea mayor a hoy, para ello en lugar de filtar la colección mediante su operación de negocio y creación y carga de filtro, utilizamos linq.

Dim lista = (From acuerdo As GRMMapper.EntidadesNegocio.Administracion.ENAcuerdo _

In colAcuerdos.ToList _

Where  (acuerdo.Fechainicio >= now) _

Select acuerdo)

Nos creamos una variable en la que almacenaremos los datos obtenidos de la consulta.

Importante, a mí me pasa a menudo, no olvidar convertir la colección a una lista (colAcuerdos.ToList)

Recorremos la colección de acuerdos, convertida en lista, de acuerdo en acuerdo.

Where, cláusula como en sql con la condición,

Y el dato a recuperar, Select acuerdo, podríamos sólo haber recuperado la fechafin, poniendo

acuerdo.Fechafin

En lista, tendríamos almacenado una colección de acuerdos filtrados en una sola línea.

Hasta aquí fácil, ahora un ejemplo de una INNER JOIN este más complicado de encontrar por internet.

Imaginemos que tenemos otra entidad en la que relacionamos los acuerdos con los procuradores que los firman cada año.

Imports System

Imports System.Collections.Generic

Imports System.Text

Namespace EntidadesNegocio.Administracion

”’ <summary>

”’ EDAcuerdoprocurador  – Relación de Acuerdos y procuradores

”’ </summary>

”’ <remarks></remarks>

<Serializable()> _

Partial Public Class ENAcuerdoprocurador

Public Sub New()

MyBase.New()

End Sub

Private m_Pk As Nullable(Of Integer)

Private m_Fkacuerdo As Nullable(Of Integer)

Private m_Fkprocurador As Nullable(Of Integer)

”’ <summary>

”’ Identificador único del acuerdo-procurador.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Pk() As Nullable(Of Integer)

Get

Return m_Pk

End Get

Set(ByVal value As Nullable(Of Integer))

m_Pk = value

End Set

End Property

”’ <summary>

”’ Identificador del acuerdo.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Fkacuerdo() As Nullable(Of Integer)

Get

Return m_Fkacuerdo

End Get

Set(ByVal value As Nullable(Of Integer))

m_Fkacuerdo = value

End Set

End Property

”’ <summary>

”’ Identificador del procurador.

”’ </summary>

”’ <value></value>

”’ <returns></returns>

”’ <remarks></remarks>

Public Property Fkprocurador() As Nullable(Of Integer)

Get

Return m_Fkprocurador

End Get

Set(ByVal value As Nullable(Of Integer))

m_Fkprocurador = value

End Set

End Property

End Class

End Namespace

Ahora vamos a ver como enlazar las dos entidades en una línea…

Supongamos que queremos recuperar los acuerdos de los procuradores que cuya fecha de finalización no ha llegado o es hoy.

Dim listaAcuerdosVigentesFuturos = _

(From acuerdo As EntidadesNegocio.Administracion.ENAcuerdo In colAcuerdos.ToList _

Join ap As EntidadesNegocio.Administracion.ENAcuerdoprocurador In colAP.ToList _

On acuerdo.Pk Equals ap.Fkacuerdo  Where acuerdo.Fechafin >= Now _

Select acuerdo)

From: Definimos la entidad origen (.ToList)

Join: definimos la entidad con la que comparar (.ToList)

On: Como en SQL definimos cuál es la relación entre las entidades.

Where: Definimos la condición de filtrado.

Select: Definimos el dato a recuperar, hemos puesto acuerdo, pero podríamos haber puesto ap

o acuerdo.fechainicio, acuerdo.fechafin, ap.fkprocurador.

Espero que con este ejemplo pueda recordar como se usa LINQ en el futuro y os sirva a vosotros…

Sean felices desarrollando.

Anuncios
La que has liado

Fotografiar con palabras, nuestro momento, nuestra época. Del 1.1 al 2.0

TERZERO

Pio Baroja

El árbol inútil

Blog de cuentos, libros y mala poesía

tu.deinflexión

somos dueños de nuestro destino, inventores de nuestro futuro y nuestra felicidad...

Frikstation

Pasión por el mundo de la televisión, el cine, los videojuegos y su merchandising.

A %d blogueros les gusta esto: