domingo, octubre 31, 2010

Introduccion a LINQ Parte 3.4 (Arquitectura)

Artículos relacionados

Parte 1, Parte 2, Parte 3.1, Parte 3.2, Parte 3.3

En esta oportunidad hablaremos sobre las Expresiones Lambda en C# y VB.

Podemos decir que las expresiones lamba son le evolución natural de los métodos anónimos incluidos en C# 2.0. Esto nos permite utilizar una sintaxis mas compacta al momento de escribir nuestro código. Veamos un par definiciones del sitio de Microsoft:

"Una expresión lambda es una función anónima que puede contener expresiones e instrucciones y se puede utilizar para crear delegados o tipos de árboles de expresión"

"Una expresión lambda es una función sin nombre que calcula y devuelve un solo valor. Se pueden utilizar las expresiones lambda dondequiera que un tipo de delegado sea válido"

Creo que la forma mas sencilla de entender este concepto es mediante un ejemplo que muestre la evolución de los cambios en la sintaxis de los lenguajes hasta llegar a las expresiones lambda.

C#

image

VB

image

En el código anterior podemos ver la definición de un delegado que recibe un tipo Int, Integer y retorna un tipo bool, Boolean, esto servirá para poder sustituir cualquier función que tenga esa firma en el procedimiento Mostrar Números. Y definimos dos funciones una que indica si un numero es par y la otra si es mayor a 5. Ahora veamos como se invocaría dicho método usando los delegados. (C# 1.0 y VB 7.0)

C#

image

VB

image

Recientemente se introdujo el concepto de funciones anónimas, que permiten eliminar la necesidad de definir el delegado especifico y en su lugar usar un delegado genérico. ( esto  se puede aplicar en  ambos lenguajes). Ejemplo:

C#

image

VB

image

En C# 2.0 se introdujo el concepto de métodos anónimos como un medio de escribir bloques de instrucciones insertados sin nombre que se pueden ejecutar en una invocación de delegado (no se necesita definir previamente el delegado). Ejemplo:

C#

image

Finalmente esto se puede escribir utilizando expresiones lambda de la siguiente forma:

C#

image

VB

image  

Como pueden ver las expresiónes lamda permiten una sintaxis mas compacta y pueden contener instrucciones como en el ejemplo anterior o expresiones, de aquí surge el concepto de arboles de expresión que tocaremos en la siguiente entrega y veremos como se aplican todos los conceptos que hemos visto en las consultas LINQ.

Pueden descargar el código fuente aquí.

Hasta la proxima.

lunes, octubre 18, 2010

Introducción a LINQ Parte 3.3 (Arquitectura)

Artículos relacionados:

Parte 1Parte 2Parte 3.1, Parte 3.2

En esta ocasión hablaremos sobre Tipos Anónimos y Métodos de Extensión.

Tipos Anónimos

Son una forma abreviada de inicializadores de objetos que permiten omitir la especificación del tipo cuando se inicializan objetos o colecciones temporales. Por ejemplo en el articulo anterior utilizamos la clase LineaProducto, podríamos omitir la especificación del tipo y por ende eliminar la necesidad de la definición de la clase. Los tipos anónimos son tipos esenciales para las proyecciones de LINQ, las cuales permiten  incorporar el equivalente en LINQ de una lista de campos en una consulta SQL (mediante la instrucción SELECT).

veamos un ejemplo:

C#

image

VB

image

El compilador infiere el tipo de las tuplas, por lo que los objetos resultantes son strongly typed definidos así: IEnumerable<<int, int, decimal>> y IEnumerable(of  VB$AnonymousType_0 (of Integer, Integer, Decimal)) respectivamente.

Métodos de Extensión

Estos permiten agregar métodos propios a tipos previamente definidos, incluso si estos son sealed en C# o NotInheritable en VB. Por ejemplo el tipo string / String es sealed  y tiene varios métodos accesados por (.) como stringTest.Lenght() o “esto es un test”.Lenght(). El compilador trata estas sentencias como si fueran miembros de una librería de funciones como Length(stringTest) o Length(“esto es un test”).

Por ejemplo el método length genera una excepción si el valor es null o nothing. Seria útil tener un método LengthNullable() que retornara int?, Integer? o Nullable(of Integer) que eliminaría la necesidad de revisar si el valor es null o Nothing antes de invocar al método Length. Veamos como se puede hacer utilizando métodos de extensión.

C#

image

Los métodos de extensión deben ser definidos como public static anteponiendo la instrucción this al primer argumento del método el compilador sabe que es un método de extensión, el segundo argumento es el tipo al que aplica el método para este ejemplo string y el tercero es el nombre de la instancia. Los métodos de extensión tienen soporte para IntelliSense.

image 

VB

image

De acuerdo a la documentación de Visual Studio 2008 se pueden aplicar métodos de extensión a los siguientes tipos Clases, Estructuras, Interfaces, Delegados y Arreglos.

Hasta la próxima.

Revisar el estado de los Jobs de SQL Server con PowerShell


Una tarea muy común de todo DBA es revisar el estado de los Jobs de SQL Server, para esto podemos utilizar el siguiente script en PowerShell. (La lista de servidores se carga a partir de un archivo te texto “sqlservers.txt”). Espero les sea de utilidad.
# Carga el assembly

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null

# Obtiene la lista de servidores SQL

$sqlservers = Get-Content "$Env:USERPROFILE\sqlservers.txt";

# Revisa los Jobs

Write-Host "Revision de Jobs de SQL Server"
Write-Host "=========================================================="
Write-Host " "

foreach($sqlserver in $sqlservers)
{
    $srv = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $sqlserver
    
    Write-Host "Server -- $sqlserver"
    Write-Host "========================================================"
    
    $jobs = $srv.JobServer.Jobs | Where-Object {$_.IsEnabled -eq $TRUE} | Select Name,LastRunOutcome, LastRunDate

    foreach($job in $jobs)
    {
        $colour = "Green";
        if ( $job.LastRunOutcome -eq "Failed"){                
            $colour = "Red";
        }
        Write-Host -ForegroundColor $colour $job.Name $job.LastRunOutcome $job.LastRunDate  
    }
    Write-Host
}

viernes, octubre 15, 2010

Introducción a LINQ Parte 3.2 (Arquitectura)

Artículos relacionados:

Parte 1Parte 2Parte 3.1

Continuando con los cambios a los lenguajes para soportar LINQ veremos algunas formas de inicializar objetos, arreglos y colecciones.

Inicializadores de Objetos

para este ejemplo crearemos una clase utilizando propiedades automáticas (otra de las nuevas funcionalidades de C# 3.0) y después compararemos la forma de inicializarla anteriormente con la forma simplificada de hacerlo ahora.

C#

image

en la versiones 1.0 y 2.0  se inicializaba de esta forma.

image

en la versión 3.0 quedaría así.

image

VB

en la versión 8.0 se inicializaba así.

image

en la versión 9.0 quedaría así.

image

Inicializadores de Arreglos

veamos un ejemplo inicializando un arreglo de objetos tipo LineaProducto

C#

image

VB

en VB 9.0 no es posible utilizar inicializadores de objetos para inicializar arreglos, sin embargo se pueden asignar elementos creados por inicializadores de objetos a un arreglo de esta forma

image

 

Inicializadores de Colecciones

Esto se aplica a las colecciones que soportan la interface IEnumerable y tienen un método .Add

C#

image

VB

image

En la siguiente entrega hablaremos sobre los métodos de extensión.

Hasta la próxima.

miércoles, octubre 13, 2010

Introducción a LINQ Parte 3.1 (Arquitectura)

Artículos relacionados:

Intro a LINQ Parte 1

Intro a LINQ Parte 2

Ahora veamos en detalle las extensiones hechas a los lenguajes para soportar LINQ:

Variables Implícitas (Inferencia de Tipos):

Permite inferir el tipo de variable en base a su inicialización.

Ejemplos:

C#

image

VB

image

Al ejecutar estas instrucciones podemos notar que la variable nombre es de tipo string, que la variable cantidad es de tipo int y numeros es un arreglo tipo int. Esto nos indica que NO son variables dinámicas (esto ya es soportado en el framework 4.0  ) sino que son variables tipadas pero inferidas por el compilador. Lo que se puede apreciar en el IL generado.

image

ahora veamos como se aplica esto en una consulta basada en LINQ

C#

image

VB

image

las variables numeros y query infieren su tipo en base a la expresión asignada, hay que notar especialmente la variable query que almacena una consulta linq (query expression) de allí la necesidad de soportar inferencia de tipos en los lenguajes.

Hasta la próxima.