Monthly Archives: July 2009

No usar el metodo IEnumerable.Count de LINQ

.NET Logo

.NET Logo

Los que usen LINQ, especificamente LINQ to SQL, favor de leer el siguiente articulo:

IEnumerable.Count() is a Code Smell

El articulo explica que es muy comun para cualquier desarrollador utilizar este metodo para hacer validaciones del tipo:

if(products.Count() == 0) ... 

El problema es que el metodo Count() de IEnumerable es un extension method que no va a hacer short-circuit al encontrar más de un item al ser usado en el contexto del ejemplo anterior.

Peor aun, como la ejecución de LINQ To SQL es deferida, los resultados del metodo Count() no se quedan en cache y cualquier nueva llamada a Count() vuelve a iterar todos los elementos de la coleccion. Tomando en cuenta que LINQ To SQL esta accesando una base de datos…es muy mal performance.

El articulo sugiere usar como alternativa el metodo .Any(). que produce un SQL mas optimizado.

Y si se necesita hacer llamadas posteriores al Count() o Any(), se recomienda eliminar la deferred execution pasando los resultados del query de LINQ a una Lista, de la siguiente manera:

IList<Product> products = GetProducts().ToList();

Para detalles completos, favor de leer el articulo original, del blog de Lee Richardson, Rapid Application Development

Enumeraciones de Folders Especiales en .NET – System.Environment.SpecialFolder

System.Environment.SpecialFolder

System.Environment.SpecialFolder

He visto demasiados programas, utilerías y software en general que todavía intentan adivinar o equivocadamente predefinen el path o ruta a folders especiales de Windows, como Program Files, Documents and Settings, etc. Esto puede resultar en dos cosas, cualquiera de las dos muy molestas y muy mal vistas:

  1. El programa no funciona.
  2. El programa termina creando folders no deseados en el sistema.

El #2 es especialmente molesto…¿para que sirve que instale Windows en Ingles, si un programa mal hecho va a terminar creando H:\Archivos de Programa de todas maneras?

Es simplemente pésimo diseño de software el asumir y programar software contra la suposición de que el usuario que está corriendo nuestra aplicación instaló Windows en el mismo Disco Lógico que nosotros. Las empresas generalmente instalan Windows en cualquier directorio excepto C:\Windows, precisamente porque muchos virus, troyanos, etc. fabricados por amateurs solo intentan instalarse contra C:\Windows, así que instalar Windows en un directorio diferente al predeterminado es una simple protección extra. Es por esto que un desarrollador nunca debe intentar adivinar la ruta a un folder especial de Windows.

Microsoft, en el namespace System, provee un metodo y una enumeration en conjunto que permite obtener directamente de Windows el path/ruta a varios folders especiales de Windows:

El metodo es estático, y se llama Environment.GetFolderPath, que recibe como parámetro un enum de tipo Environment.SpecialFolder.

Los valores del enumeration Environment.SpecialFolder son:

  1. ApplicationData
  2. CommonApplicationData
  3. Cookies
  4. Desktop
  5. Favorites
  6. History
  7. InternetCache
  8. Programs
  9. MyComputer
  10. MyMusic
  11. MyPictures
  12. Recent
  13. SendTo
  14. StartMenu
  15. Startup
  16. System
  17. Templates
  18. DesktopDirectory
  19. Personal
  20. MyDocuments
  21. ProgramFiles
  22. CommonProgramFiles

Ver detalles en MSDN sobre System.Environment.SpecialFolders

Ver detalles en MSDN sobre System.Environment.GetFolderPath

La forma correcta de obtener el path al folder de Program Files, seria entonces:

string programFilesPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)

lo cual, en mi sistema, resultaría en “H:\Program Files”.

Aliases de conexion en SQL Server

Un Alias de SQL es un nombre alternativo que se utiliza para realizar una conexion a un servidor de SQL Server. El alias encapsula los elementos requeridos de un string de conexion (como protocolo, puerto, hostname o ip), y los encapsula con un nombre escogido por el usuario.

El alias de SQL es algo similar o equivalente a un ODBC para Windows, excepto que el alcance del alias es solamente en aplicaciones relacionadas con SQL, es decir, no podríamos hacer un ping al alias desde una ventana de DOS.

En algunos comentarios leí que si en el campo de Server Name utilizamos el numero de IP directamente, en lugar del hostname (reverse DNS), podemos agilizar un poco la conexion debido al ahorro del dns lookup.

Ahora si, hay dos maneras de agregar un Alias de SQL:

  1. SQL Server Client Network Utility (cliconfg)
  2. SQL Server Configuration Manager

Por simplicidad yo siempre uso la primera, cliconfg. Los pasos para agregar un alias usando la Client Network Utility son:

  1. Start -> Run
  2. Teclear “cliconfg” -> Enter
  3. Ir al tab de Alias “Add
  4. LLenar los datos (Server Alias, Protocolo, etc)
  5. Click en OK.

Figura 1: Dialogo principal de la SQL Server Client Network Utility

SQL Server Client Network Utility (cliconfg)

SQL Server Client Network Utility (cliconfg)

Figura 2: Dialogo de Nuevo Alias de la SQL Server Client Network Utility

Nuevo SQL Alias usando cliconfg

Nuevo SQL Alias usando cliconfg

El ejecutable cliconfg.exe está en el directorio de Windows\System32, y como el folder de System32 está en las variables de ambiente de Windows, podemos simplemente teclear el nombre del ejecutable desde cualquier lugar y lo reconocerá. Cliconfg.exe viene pre-instalado desde Windows 2000, así que nos permite agregar aliases de SQL sin instalar las SQL Server Client Tools.

La segunda manera de consultar los Aliases existentes, y de agregar nuevos, es usando el SQL Server Configuration Manager.

Para acceder al SSCM los pasos son:

  1. Start – > Run.
  2. Teclear “compmgmt.msc” -> Enter.
  3. En el arbol del lado izquierdo, escoger “Services and Applications“.
  4. Escoger “SQL Server Configuration Manager“.
  5. Escoger “SQL Native Client Configuration“.
  6. Escoger “Aliases“.

Figura 3: Pantalla principal del SQL Server Configuration Manager

SQL Server Configuration Management  - Aliases

SQL Server Configuration Management - Aliases

Para agregar un alias nuevo usando el SQL Server Configuration Manager, simplemente hay que escoger la opcion “New Alias” del menú “Action“, y llenar los datos del diálogo.

Figura 4: Dialogo de Nuevo Alias usando SQL Server Configuration Manager

Nuevo Alias SLQ usando SQL Server Configuration Manager

Nuevo Alias SLQ usando SQL Server Configuration Manager

Por cierto, la unica ventaja del SQL Server Configuration Manager sobre la Client Network Utility, es que permite exportar la lista de Aliases a un archivo de texto, a través del menú “Action“, escogiendo “Export List“.

Una vez agregado el alias, podemos utilizarlo en el dialogo de conexion del SQL Server Management Studio, por ejemplo, y solamente teclear el nombre del alias, en lugar del hostname o ip y el puerto, en caso de que antes fuera requerido.

 Scroll to top