dedicada a los profesionales de la plataforma .net linq · entidades de ado.net 3.5 para el...

60
Las nuevas certificaciones para desarrolladores Aplicación vs. Aplicación Task Parallel Library (TPL) y Parallel LINQ (PLINQ) entrevista José Murillo División de Desarrollo y Plataforma Microsoft Ibérica LINQ entrevista José Murillo División de Desarrollo y Plataforma Microsoft Ibérica nº 48 mayo 2008 6,50 Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows Server System dedicada a los profesionales de la plataforma .NET dotNetManía www.dotnetmania.com dotNetManía Formación TodotNet@QA LINQ Laboratorio.NET además Verificación de ortografía utilizando SharePoint Server Visual Studio Team System 2008, trabajo en equipo además Verificación de ortografía utilizando SharePoint Server Visual Studio Team System 2008, trabajo en equipo Clases de entidad en LINQ to SQL• El Marco de trabajo de entidades de ADO.NET v3.5 (V) • LINQ y desarrollo Web: el control LinqDataSource • To Select or not to Select... Ésa es la cuestión sobre las consultas de LINQ Clases de entidad en LINQ to SQL• El Marco de trabajo de entidades de ADO.NET v3.5 (V) • LINQ y desarrollo Web: el control LinqDataSource • To Select or not to Select... Ésa es la cuestión sobre las consultas de LINQ Las nuevas certificaciones para desarrolladores Aplicación vs. Aplicación Task Parallel Library (TPL) y Parallel LINQ (PLINQ)

Upload: lengoc

Post on 04-Oct-2018

235 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Las nuevas certificaciones para desarrolladores

Aplicación vs. Aplicación

Task Parallel Library (TPL) y Parallel LINQ (PLINQ)

entrevistaJosé MurilloDivisión de Desarrollo y PlataformaMicrosoft Ibérica

LINQentrevistaJosé MurilloDivisión de Desarrollo y PlataformaMicrosoft Ibérica

nº 48 mayo 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows Server System

www.

dotne

tman

ia.co

m

dedicada a los profesionales de la plataforma .NET

dotNetManíawww.

dotne

tman

ia.co

m

dotNetManía

Formación

TodotNet@QA

L INQ

Laboratorio.NET

ademásVerificación de ortografía utilizando SharePoint ServerVisual Studio Team System 2008, trabajo en equipo

ademásVerificación de ortografía utilizando SharePoint ServerVisual Studio Team System 2008, trabajo en equipo

Clases de entidad en LINQ to SQL• El Marco de trabajo deentidades de ADO.NET v3.5 (V) • LINQ y desarrollo Web: el controlLinqDataSource • To Select or not to Select... Ésa es la cuestiónsobre las consultas de LINQ

Clases de entidad en LINQ to SQL• El Marco de trabajo deentidades de ADO.NET v3.5 (V) • LINQ y desarrollo Web: el controlLinqDataSource • To Select or not to Select... Ésa es la cuestiónsobre las consultas de LINQ

Las nuevas certificaciones para desarrolladores

Aplicación vs. Aplicación

Task Parallel Library (TPL) y Parallel LINQ (PLINQ)

Page 2: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases
Page 3: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Bienvenido al número 48, de mayo de2008, de dotNetManía.

Una tecnología que simplifica elacceso a datos nos interesa a la mayo-ría de los desarrolladores profesiona-les. No en vano, el acceso a datos estápresente en gran parte de los desarro-llos que hacemos. Pero ¿cómo es estode incluir en el lenguaje instruccionesde acceso a datos? Si se generan pordetrás auténticas sentencias de accesoa datos, ¿son éstas óptimas y cómo deóptimas?, ¿uso aún ADO.NET oaprendo ya LINQ y LINQ to SQL?,¿qué diferencias hay con Entity Fra-mework?, ¿cuándo saldrá Entity Fra-mework?... Tengo respuestas paratodas estas preguntas, y aún hay másen este especial de LINQ. Primerocon la entrevista de Marino Posadasy Octavio Hernández a José Muri-llo, que es el responsable de ISV deMicrosoft Ibérica, aunque le “interro-gamos” en calidad de experto enLINQ y tecnologías afines. MiguelKatrib publica “Clases de entidad enLINQ to SQL”, José Manuel Alar-cón, experto en desarrollo Web, titu-la su aportación como “LINQ y desa-rrollo Web: el control LinqDataSour-ce”, Guillermo “Guille” Som (sí, éltambién ha caido, y los que le conoce-mos sabemos de su aversión al accesoa datos) publica “To Select or not toSelect... Ésa es la cuestión sobre las

consultas de LINQ” desde su Isla.VB(e insiste –generosamente– en donarsus ingresos a la causa de Juanma y dela lucha contra la enfermedad de Ale-xander), Unai Zorrilla y Octavio Her-nández siguen con la quinta entregade su serie, que encaja perfectamenteen este número, “El Marco de traba-jo de entidades de ADO.NET v3.5(V)” y, por último, Octavio Hernán-dez dedica la revisión del laboratoriode este mes a “Task Parallel Library(TPL) y Parallel LINQ (PLINQ)”,abandonando temporalmente la líneade evaluar productos comerciales.

Quizá en esta larga lista de autoresle haya llamado la atención las veces quese repite el nombre de Octavio Hernán-dez. Octavio es uno de los mayoresconocedores de LINQ en España yautor del libro “C# 3.0 y LINQ”. Queeste libro se haya agotado en unos pocosmeses demuestra que LINQ está gene-rando mucha expectación. También labuena salud de la editora, Krasis Press,que empieza con buen pie.

Por último, si desea certificarse,tendrá que estar bien informado sobre“las nuevas certificaciones para desa-rrolladores”. Éste es precisamente eltítulo del artículo de José Manuel Alar-cón, que explica cómo son los nuevosexámenes y lo que está por llegar.

Espero que lo que les presentamosles sea de utilidad. ¡Dentro hay más!

dotN

etM

anía

<<

3

Todos hablan de LINQ

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 48 • Mayo 2008Precio: 6,50 €

EditorPaco Marín ([email protected])

Redactor jefeMarino Posadas([email protected])

Editor técnicoOctavio Hernández([email protected])

RedacciónDino Esposito, Guillermo 'Guille' Som, LuisMiguel Blanco y Miguel Katrib (Grupo Weboo)

Empresas Colaboradoras

Alhambra-Eidos

Krasis

Plain Concepts

Raona

Solid Quality Mentors

Además colaboran en este númeroCarles Vallejo, Gustavo Vélez, José ManuelAlarcón y Unai Zorrilla.

IlustracionesMascota (Clico): Yamil HernándezPortada: Javier Roldán

FotografíaMartín QuirósRoberto Mariscal

Atención al suscriptorPilar Pérez ([email protected])

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528522 - Rivas Vaciamadrid (Madrid)

www.dotnetmania.com

Tf. (34) 91 666 74 77Fax (34) 91 499 13 64

ImprimeGráficas MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

dotNetManíadotNetManía

Paco Marín

Page 4: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

sumario 48Eventos 08-10

MVP Global Summit 2008User Group Management SummitSharePoint Conference 2008

Entrevista a José Murillo 12-15En el marco del evento TechDays 2008, dotNetManía entrevistó a José Murillo, ISV DevelopmentAdvisor en Microsoft Ibérica, quien tuvo a su cargo la ponencia central relacionada con dos nuevastecnologías primordiales que forman parte de .NET Framework 3.5: LINQ (Language IntegratedQuery) y ADO.NET Entity Framework. Con su simpatía habitual, José respondió diligentementea todas nuestras preguntas.

El Marco de trabajo de entidades de ADO.NET v3.5 (V) 16-19Continuando con nuestra serie dedicada a presentar las posibilidades que ofrecerá el Marco deentidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados amodelos relacionales de bases de datos, en esta entrega hablaremos sobre los mecanismos quetendremos a nuestra disposición para expresar las relaciones entre entidades.

Clases de entidad en LINQ to SQL 20-26Este artículo explica cómo las clases de entidad que LINQ to SQL genera para hacer el mapeo entreuna base de datos SQL y objetos en memoria expresan de manera sencilla las relaciones uno a uno yuno a muchos que existen en el diseño de las tablas relacionales. El trabajo muestra también cómopodemos, de un modo no invasivo, ampliar el código de mapeo para poder expresar relacionesmuchos a muchos que nos harán más simple la programación.

Verificación de ortografía utilizando SharePoint Server 27-32Microsoft Office SharePoint Server (MOSS) dispone de un servicio para la comprobación deortografía. El servicio se utiliza en algunos componentes por defecto de MOSS y está disponible paraser utilizado por desarrolladores, de tal forma que pueda ser implementado en softwarepersonalizado, como WebParts o páginas especializadas.

LINQ y desarrollo Web: el control LinqDataSource 33-36A estas alturas de la revista, no voy a ser yo quien le hable de LINQ y todas sus ventajas. Ya deberíaestar convencido. Lo que sí intentaré es mostrarle cómo sacarle partido a LINQ en el desarrollo deaplicaciones Web y aplicaciones en capas en general.

Visual Studio Team System 2008, trabajo en equipo 38-41Con la reciente presentación de Visual Studio Team System 2008, Microsoft renueva su apuestapor ofrecer una solución orientada a mejorar la gestión del ciclo de vida de las aplicaciones (ALM,Application Life-cycle Management). Esta solución se compone de un conjunto de herramientas,procesos y guías, integradas en un solo entorno, para potenciar el trabajo en equipo de los diferentesroles que participan en el proceso de desarrollo de software.

To Select or not to Select... Ésa es la cuestión sobre las consultas de LINQ 42-46No vamos a entrar en la discusión de cómo traducir el título de este artículo, aunque éste sería másfácil que el original “To be or not to be”, ya que casi nadie se pone de acuerdo sobre si es “ser o noser” o “existir o no existir”. Lo que es seguro es que en las consultas integradas de Visual Basic 9.0,la cláusula Select existe, pero no tiene por estar (o ser).

dnm.todotnet.qa 48-50Aplicación vs. Aplicación

dnm.laboratorio.net 52-54Task Parallel Library (TPL) y Parallel LINQ (PLINQ)

dnm.formación.net 55-57Las nuevas certificaciones para desarrolladores

dnm.desvan 58

Page 5: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases
Page 6: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Un total de 48 universidades españolas hanparticipado en esta V edición nacional deImagine Cup, en la que se proponía a losestudiantes desarrollar proyectos tecnológi-cos basados en el lema “Imagina un mundodonde la tecnología facilite un medioambiente sostenible”

El proyecto ganador de la final españo-la de Imagine Cup ha sido Windows Drive,proyecto creado por un equipo de las uni-versidades de Oviedo y Alicante, que ha des-tacado entre los cinco proyectos presentadosporque su idea de fomentar el uso comparti-do de vehículos de los contactos habitualeses perfectamente viable en nuestra vida dia-ria. Basándose en una plataforma de serviciosdesarrollados según la filosofía de WindowsLive, esta solución convierte a Windows Liveen una red social al servicio del medio ambien-te y permite ahorrar energías no renovables,así como disminuir la contaminación acústi-ca de las ciudades. Este proyecto utiliza ser-vicios ya existentes en Windows Live, aña-diéndole nuevos servicios que facilitan a losusuarios compartir sus vehículos con sus con-tactos habituales de Messenger, Hotmail, etc.

En cuestión de segundos, un usuario podráconocer los planes de utilización del vehícu-lo privado de sus contactos y averiguar si, porejemplo, en su trayecto diario podría recogera alguno de sus colegas. Y podrá hacerlo através de una página Web (www.windowsdri-ve.es), de una aplicación en su escritorio, des-de el móvil, desde su televisión gracias a Win-dows Media Center o desde el mismo Win-dows Live Messenger.

El segundo clasificado ha sido el equipode la Universidad de Castilla-La Mancha,creador del proyecto Paneles EcológicosInteractivos. Éste permite la comunicación,interacción e intercambio de informaciónrelacionada con el desarrollo sostenible delmedio ambiente de forma rápida y sencillagracias a la tecnología RFID. Además delcontenido valioso y multimedia de los pane-les, las personas podrán interactuar en unared social conectada a través de su móvil,mandar sus opiniones, comentarios, aporta-ciones. Han recibido una consola Xbox y elpremio especial Emprendia, por el queMicrosoft les brindará el soporte necesariopara iniciar un proyecto empresarial.

El tercer clasificado ha sido la Univer-sidad Pontificia de Salamanca, que ha idea-do un sistema informatizado para la separa-ción y clasificación inteligente de residuos,garantizando su correcto reciclaje y evitan-do horas de trabajo manual. El sistema, lla-mado Intelligent Garbage Classifier, constade una cinta que transporta los residuos, unacámara que los detecta y un brazo mecáni-co que los traslada. Han recibido como pre-mio dispositivos móviles inteligentes conWindows Mobile, así como el premio espe-cial Avanade, por el que este partner deMicrosoft les ofrece un puesto de trabajo unavez finalizada su etapa universitaria.

Los ganadores viajarán a París del 3 al 8de julio, para representar a España en la granfinal internacional de esta competición acadé-mica. Allí deberán defender la calidad y ori-ginalidad de su proyecto Windows Drivefrente al resto de equipos clasificados, per-tenecientes a más de cien países. Los tresprimeros clasificados en la gran final reci-birán 15.000, 10.000 y 5.000 dólares.

Más información en www.imaginecup.com.

dotN

etM

anía

<<

6

El pasado 22 de abril, Microsoft anun-ció los ganadores de la segunda fase delconcurso internacional Ingenuity Point,destinado a premiar a las soluciones másinnovadoras desarrolladas con softwarede Microsoft en los campos de la educa-ción, sanidad y protección del medioambiente. En el vertical de sanidad, obtu-vo el primer premio la herramientaLebab, un software creado por un equi-po multidisciplinario con el objetivo deayudar a mejorar la comunicación entreel personal médico y los pacientes quehablan en distintos idiomas, apoyándo-se en una base de datos de términos y fra-ses en seis idiomas (español, inglés, chi-no, árabe, rumano y búlgaro, a los que seañadirán otros en un futuro próximo), un

potente motor de búsqueda y una inter-faz de usuario amistosa basada en WPF.En el desarrollo del producto tomaronparte varios especialistas de Plain Con-cepts.

Lebab ha sido concebido alrededorde una arquitectura modular. El módu-lo de Urgencias y Emergencias ya estásiendo utilizado por SAMUR en laComunidad de Madrid, y el módulo deAtención Primaria está siendo implanta-do en varias dependencias de SACYL(Castilla y León). Módulos para otrossectores se encuentran actualmente enpreparación.

Más información en http://www.theingenuitypoint.com y en http://www.lebabsystems.es.

Premio de Microsoft para software español

noticiasnoticias

noticias

noticias

noticias

El equipo creador del proyecto Windows Drive, ganadorde la Imagine Cup de Microsoft en España

Según anunció el pasado día 9 Elisa Flas-ko, program manager del Data Program-mability Team de Microsoft, las versio-nes oficiales de Entity Framework (inclu-

yendo el diseñador visual de entidades)y ADO.NET Data Services (hasta elmomento conocidos bajo el nombreAstoria) saldrán a la luz como parte del

Service Pack 1 de .NET Framework 3.5y Visual Studio 2008, que estará dispo-nible próximamente. Más informaciónen http://blogs.msdn.com/adonet.

Entity Framework & ADO.NET Data Services serán parte del SP1 de .NET 3.5 y VS2008

El pasado día 11 se puso a disposición delpúblico el .NET Enhancements Training Kit,un conjunto de presentaciones, demos y hands-on-labs que permitirán a los desarrolladoresfamiliarizarse rápidamente con toda una seriede nuevas tecnologías que harán su debut ofi-cial con la próxima aparición del SP1 de.NET Framework 3.5 y Visual Studio 2008,entre las que destacan Entity Framework deADO.NET, los servicios de datos deADO.NET (anteriormente Astoria), la nue-va arquitectura Modelo-Vista-Controlador(MVC) para ASP.NET o los controles Sil-verlight para ASP.NET, entre otros. Puededescargarlo desde http://www.microsoft.com/downloads/details.aspx?FamilyID=355c80e9-fde0-4812-98b5-8a03f5874e96.

Disponible .NET 3.5 Enhan-cements Trining Kit

Page 7: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

7

dnm.directo.noticias<<

Alhambra-Eidos presenta suscursos para mayoAlhambra-Eidos ha programado para mayosus cursos en formato blended de formacióntécnica dirigida a profesionales. Este forma-to combina la formación presencial tradicio-nal con los avances de la variedad on-line.

Alhambra-Eidos ha programado lassiguientes sesiones formativas en Madrid:- Del 5 al 13 de mayo de 2008Planning, Implementing and MaintainingWindows Server 2003 Active Directory.- Del 19 al 27 de mayo de 2008Desarrollo de aplicaciones Windows. Aspec-tos básicos y avanzados.- Del 26 al 29 de mayo de 2008Workshop de desarrollo con MOSS 2007.

Más información en: http://www.alham-bra-eidos.es.

Seminarios RaonaRaona ha programado para mayo el siguien-te seminario:- La nueva generación de las comunicacio-nes. Microsoft Unified Comunications29 de mayo en Madrid – 9:30 a 14:00.

Más información en: http://www.rao-na.com/formacion/seminarios.

Éxito de la editorial Krasis PressKrasis Pressculmina sus primeros seis meses devida consagrándose como una referencia en elsector y con un gran éxito de ventas.

En estos primeros seis meses se han ago-tado las ediciones de dos de los tres títulospublicados. En concreto, existe ya una segun-da edición revisada de los libros “C# 3.0 yLINQ”, de Octavio Hernández, y de “Desa-rrollo Web con ASP.NET”, de José M.Alarcón. Este mes ha salido al mercadoademás el título “Introducción a WindowsCommunication Foundation”, de Hadi Hari-ri, reconocido experto internacional en estamateria, que está disponible en librerías y tam-bién en www.dotnetmania.com.

Antes del verano se lanzarán otros tres nue-vos títulos sobre desarrollo de aplicacionesempresariales, aplicaciones Web conASP.NET 3.5 y desarrollo para dispositivosmóviles. Puedes apuntarte para recibir antesque nadie notificaciones sobre la disponibili-dad de todos los libros en www.krasispress.com.

Este año, denuevo el Más-ter Alhambra-Eidos en desa-rrollo de soft-

ware tendrá como foco de atención losproductos de Microsoft, Visual Studio2005, SQL Server 2005 y Biztalk Ser-ver 2006. Además, sus contenidos faci-litarán la certificación de más alto nivelde la carrera oficial para desarrollado-res de Microsoft: el MCPD Enterpri-se Applications Developer (con exá-menes de prueba, sesiones de asesora-miento, etc.).

Esta es la IV edición en formatoblended (el XV en total de la historiade la compañía), una modalidad quecombina las clases presenciales (40%)con horas de autoestudio, tutorización

y orientación (60%). Los alumnosrecibirán 176 horas lectivas presen-ciales y 255 horas de autoestudio apro-ximadamente. “La solución blendedcombina lo mejor de la formación pre-sencial y de la teleformación, ya queexige la asistencia y permite a losalumnos mantener la constancia y elinterés por ampliar los conocimien-tos. Además, se acorta la duración delcurso para que sea algo menor que unaño académico, y se puede disfrutarde clases adicionales para reforzarconocimientos”, comenta AdolfoVara de Rey, director de Formaciónde Alhambra-Eidos y Microsoft Cer-tified Learning Consultant (MCLC).

Los lectores de dotNetManía tie-nen un 10% de descuento. Más infor-mación en http://www.alham bra-eidos.es.

Alhambra-Eidos convoca su IV Máster endesarrollo de softwareLa última edición del Máster Alhambra-Eidos, dedicado al desarrollo desoftware en formato blended, se centrará en los productos Microsoftpara el desarrollo: Visual Studio 2005, SQL Server 2005 y Biztalk 2006

Solid Quality ™Iberoamérica(www.solidq.com/ib) ha anuncia-

do la realización del cuarto Solid QualitySummit en Madrid durante los días 23, 24,25, 26 y 27 de junio.

Este evento es el único en la actualidaddel mercado español que está enfocadocompletamente en Microsoft SQL Ser-ver® y tecnologías Microsoft .NET. Conmás de 60 sesiones centradas exclusiva-mente en estas herramientas, se ha con-vertido en el referente en cuanto a la pla-taforma de datos y desarrollo se refiere.

Alejandro Leguizamo, director deMarketing, menciona : “Nuestro Summitbrinda una experiencia única a los asis-tentes, permitiéndoles adquirir los mejo-res y más sofisticados conocimientos endiseño, arquitectura, implementación ysolución de problemas dentro de SQL

Server y .NET. De la mano de expertosde la industria –tanto nacionales comointernacionales– y completamente en cas-tellano, el entorno facilita una inmersiónde la más alta calidad técnica, con la tran-quilidad de poder interactuar y aprove-char cara a cara a mentores técnicos conexperiencia internacional”.

Solid Quality™ cuenta con profesio-nales muy distinguidos, siendo muchos deellos MCT, Regional Directors o MVP.

Alejandro Leguizamo: “Nuestroobjetivo con el Summit es poder trans-ferir a nuestros asistentes los resultadosde toda nuestra experiencia trabajandocon entornos de misión crítica, comoautores de libros o ponentes en confe-rencias internacionales de renombre,como Microsoft TechEd (tanto en Esta-dos Unidos como en Europa), peroajustándose completamente a las nece-sidades del mercado español”.

Solid Quality Summit 2008

Page 8: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Entre los días 14 y 17 de abril, tuvo lugar en Seattleel MVP Global Summit 2008, donde se dieron citamás de 1.700 MVP provenientes de todos los rinco-nes del mundo. Las sesiones se repartieron entre elWashington State Conference & Trade Center deSeattle y el campus de Microsoft en Redmond, don-de tuvieron lugar unas 550 sesiones que cubrían latotalidad de las áreas técnicas de la línea de produc-tos de Microsoft.

El domingo 13, justo antes del inicio de la cum-bre, sirvió de día de reencuentro con todos los demásMVP que fueron llegando durante el fin de semana,por lo que fue el día ideal para visitar la ciudad y comerlos productos típicos de la zona. Por la tarde, tuvimos

la oportunidad de asistir, con prácticamente toda ladelegación española, al partido de la NBA que dis-putaba en el Key Arena el equipo local, los SeattleSupersonics.

Parte lúdica aparte, y ya en el primer día de sesio-nes, Toby Richards, nuevo general manager del pro-grama MVP de Microsoft, dio el pistoletazo de salidacon una keynote donde destacó la importancia de losMVP dentro de las comunidades técnicas de Micro-soft. Seguidamente, Colleen Hunter-Gale, seniordirector también de la división de Servicios de Sopor-te para Comunidades, repasó el trabajo y dedicaciónde Sean O’Driscoll al frente del programa MVP a lolargo de estos últimos años. El propio Sean nos deleitó

MVP Global Summit2008

eventos

<<

event

os

Los MVP españoles, en las instalaciones del Monorraíl de Seattle

Page 9: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

9

dnm.directo.eventos<<

a continuación con una charla en la quemostró el papel determinante de losMVP en la redes sociales que se hanforjado alrededor de las diferentescomunidades técnicas.

Una de las novedades de este añofue la creación de los denominadosOpen Spaces. En concreto, fueron 14espacios abiertos repartidos en tressesiones, donde durante la tarde sedebatió con expertos en las materiascorrespondientes sobre temas destaca-dos relacionados con áreas específicasde los productos de Microsoft. Final-mente, y tras la recepción con nuestraMVP lead, Cristina González, llególa cena de bienvenida dentro del pro-pio Washington State Conference &Trade Center de Seattle.

Durante el segundo y tercer día, y yadentro del complejo operativo de la com-pañía, asistimos a charlas técnicas con losequipos de desarrollo de los diferentesproductos según el área de dedicación decada MVP. Unas jornadas agotadoras,donde pudimos ver la hoja de ruta de lamayoría de los productos e intercambiaropiniones con los propios equipos de desa-rrollo. Es en estas sesiones donde mejorse describe la relación entre los MVP yMicrosoft, transmitiéndose en ambasdirecciones las dudas, quejas, así comosugerencias y novedades sobre todos ycada uno de los productos. Debido a lagran diversificación de contenido y a lagran extensión del complejo de edificios,se pusieron a disposición de los asistentestransportes que facilitaban el movimien-to entre las diferentes sesiones.

La fiesta de los MVP, celebrada en elExperience Music Project de Seattle, sir-vió como colofón para poner punto finala los dos intensos días de sesiones técni-cas. Sin embargo, fue el jueves 17, en elúltimo día de la cumbre, cuando tuvolugar la esperada keynote de Steve Ball-mer, la cual no defraudó a nadie. Con unaaparición al más puro estilo americano, elCEO de Microsoft repasó los más de 30años de historia de Microsoft, la filosofía

con la cual nació y sigue evolucionandola empresa, y la importancia y papel quelos MVP de todo el mundo y todas lascategorías están ejerciendo sobre el pano-rama empresarial. Tras recibir varios obse-quios por parte de los allí presentes, fina-lizó, junto a Toby Richards, contestan-do y anotando cuestiones planteadas poralgunos MVP.

En definitiva, cuatro días en los quese mezclaron tanto aspectos técnicos comolúdicos, rodeados de un ambiente cordialcon profesionales de diferentes naciona-lidades, con una coordinación y organi-zación excelentes y en un escenario mara-villoso, como es la ciudad de Seattle. UnMVP Global Summit más, y ya empiezala cuenta atrás para la edición del 2009, lacual se prevé se lleve a cabo durante la pri-mera semana de marzo.

José Miguel TorresMVP Device Application Development

User GroupManagementSummit

Coincidiendo con el MVP Summit,y a continuación del mismo, secelebró el UG Management Sum-mit, el evento de coordinación yplanificación de los organismosinternacionales de gestión decomunidades técnicas de Microsoft,con gran representación del orga-nismo que principalmente nos con-cierne, INETA, en el que tuvimosuna amplia representación por par-te de los cinco organismos que laforman, INETA Noram (Norte-américa), Latam (Latinoamérica),Asia, África y Europa (al que per-tenecemos).

Estas sesiones se celebran apro-ximadamente una vez al año, en for-ma de sesiones Open Space, y pos-teriormente en grupos de trabajosegún intereses.

Este año se ha potenciadomucho el área referente a la cola-boración y coordinación entreestos organismos de gestión inter-nacionales. En lo referente a INE-TA Europa, la discusión se ha cen-trado en la reactivación del ”Quar-terly Kit”, para activar el pack cua-trimestral de “reconocimiento agrupos de usuarios”, consistente enun pack de puntos según la activi-dad del grupo y que permite tenerlibros para los miembros o pararegalar en las sesiones y animar asílas actividades de la comunidad.Este kit desapareció y estamoshablando para su reactivación.

José Luis Latorre

Page 10: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Durante la primera semana de marzo –del 3 al6– asistí en Seattle a la SharePoint Conference2008, que reúne anualmente a profesionales, part-ners, clientes y miembros del equipo de desarro-llo. El evento es considerado como el más impor-tante a nivel mundial sobre SharePoint. Pruebade ello es el hecho de que se agotaran las ins-cripciones cuatro semanas antes.

El evento empezó fuerte con la sesión inau-gural de Bill Gates, donde se presentaron datosacerca de la gran aceptación en el mercado deSharePoint, confirmándose así como el produc-to con mayor crecimiento en la historia de lacompañía. Además, cabe destacar el anuncio deExchange Online y SharePoint Online como ser-vicios ofrecidos por Microsoft, actualmente enfase beta y de los que aún no se conocen todoslos detalles.

Durante la semana hubo una media de 10sesiones simultáneas clasificadas según su temá-tica, haciendo difícil decidir a qué sesión asistiren cada momento. En general, no hubo grandesnovedades, pero sí se pudo constatar la madurezdel producto con el gran número de casos de éxi-to presentados y con las discusiones con los

ponentes durante los turnos de ruegos y pre-guntas.

Los ponentes no podían ser mejores, ya queasistieron la mayoría de los expertos mundiales,como Andrew Connell, Todd Baginski, TedPattison, Joel Oleson, Heather Solomon, entreotros. Aún con su presencia y con la de los miem-bros del equipo de desarrollo, no fue posibleobtener información acerca de la siguiente ver-sión del producto.

De las sesiones a las que asistí, personalmen-te destacaría dos. Una es la sesión sobre WebContent Management, presentada por AndrewConnell, donde disertó sobre las mejores prác-ticas para el despliegue de soluciones entre entor-nos. La segunda es la presentada por miembrosde Microsoft sobre escalabilidad, donde apunta-ron nuevos datos y anunciaron un white paperpara abril con todos los detalles. Deberemos estarpendientes a su publicación.

Pero no solo de conferencias vive el asisten-te. Paralelamente a las sesiones, había la posibi-lidad de tocar el producto, gracias los 45 hands-on-lab disponibles para los asistentes. Tambiénse nos permitió poner a prueba nuestros conoci-mientos, con la posibilidad de certificarnos insitu. Por cierto, aquí aproveché para conseguirla última certificación que me faltaba para elpóquer de certificaciones SharePoint. Asimismo,hubo lugar para el ocio, con la visita al museodel vuelo y el juego de noche, consistente en unpar de horas con 100 XBOX 360 a nuestra dis-posición.

En resumen, una gran conferencia para un granproducto. ¿Quién se apunta a la siguiente?

Àlex Peláez es software engineer de raona. Àlex estácertificado en 70-630, 70-631, 70-541 y 70-542, que leotorgan la categoría de experto en SharePoint.

eventos

<<

event

os

SharePoint Conference2008

Page 11: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases
Page 12: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

¿Por qué no te presentas a los lecto-res y les dices quién eres, quéhaces…?

Trabajo en la división de desarrolloy plataforma. La misión que tiene nues-tra división es ayudar en la adopción denuevas tecnologías a toda la comunidadde desarrolladores. Se trata de hacer lavida más sencilla tanto a empresas comoa desarrolladores individuales y a todoslos que quieran implementar tecnologíasMicrosoft, y darle todas las herramien-tas para facilitarles esa entrada. Dentrodel departamento, digamos que estamosdivididos por audiencias, por tipos deempresas. Hay un grupo que lleva

Marino Posadas es director de tec-nologías de desa-

rrollo para Españay Portugal de Solid

Quality Mentors.Puedes leer su blog

en http://www.elavefenix.net.

Octavio Hernándezes Mentoring Team

Leader de PlainConcepts, editor

técnico de dotNet-Manía y tutor de

campusMVP. Es MVP de C#

desde 2004, MCSDy MCT. Autor del

libro "C# 3.0 yLINQ".

entrevista

Responsable de ISV en la división de desarrollo y plataformaentrevista a José Murillo

En el marco del evento TechDays 2008, dot-NetManía entrevistó a José Murillo, ISV Deve-lopment Advisor en Microsoft Ibérica, quientuvo a su cargo la ponencia central relaciona-da con dos nuevas tecnologías primordialesque forman parte de .NET Framework 3.5:LINQ (Language Integrated Query) yADO.NET Entity Framework. Con su simpatíahabitual, José respondió diligentemente a todasnuestras preguntas.

Marino PosadasOctavio Hernández

Page 13: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

audiencia de universidades, hay otro gru-po que trabaja con desarrolladores pro-fesionales, y yo concretamente me encar-go de las empresas de desarrollo de soft-ware (ISV), que como sabéis son empre-sas que se dedican a hacer softwareempaquetado que luego pueden venderen establecimientos o a través de mayo-ristas o el canal.¿Y qué tipo de asesoría os suelen soli-citar esos ISV?

Pues una de las cosas que más nospiden es estar al tanto de las novedadesque vayan a ir saliendo en un futuro. Porejemplo, para un fabricante de ERP esfundamental, si va a salir Windows Vis-ta o un Service Pack o la nueva versiónde Internet Explorer, conocerlo conantelación, para que en el momento quepongamos esa nueva versión en el mer-cado su producto sea compatible. Éstaes una de las demandas, y la otra es queles ayudemos a adoptar nuevas tecno-logías que les ayuden a aumentar su pro-ductividad. Si salen versiones nuevas de.NET Framework, pues que les ayude-mos a evaluarlas, a implantarlas y unpoco darles todos los servicios que nece-sitan. Es algo muy personalizado, o almenos intentamos tener un contactodirecto con ellos, conocer su producto,y en cuanto disponemos de alguna nue-va herramienta que les puede venir bien,pues vamos, les hacemos algunas demos,

e incluso llegamos a hacer con ellossesiones de arquitectura.¿Es extrapolable ese trabajo tuyo conlos ISV a otros sectores, y hasta quépunto?

Sí, yo creo que es totalmente extra-polable. En el caso de LINQ o EntityFramework, ese trabajo va a jugar unpapel fundamental en cuanto que todaslas aplicaciones, sean del partner que sean,tienen la necesidad de programar el acce-so a datos, algo que tradicionalmente hasido muy pesado. Creo que a Microsoftle faltaban esas dos piezas que ahora hanaparecido, y era algo que ya se veníademandando hace tiempo. La cantidadde miles de líneas de código que hacíanfalta para acceder a datos era excesiva. ¿Luego tú crees que el gran motivopara la adopción de LINQ es el códi-go que ahorra y la inmediatez quepermite tener en el acceso a datos?

Sí, yo creo que sí, que ése es uno delos motivos fundamentales. El tema dela productividad, la cantidad de líneasque va a ahorrar y por lo tanto de man-tenimiento que va a quitar.Supongo que eres optimista en cuan-to a la adopción inmediata de esta tec-nología, ¿no?

Sí, lo que pasa es que es algo com-plejo. En el caso de los ISV, generalmentesuelen hacer aplicaciones que intentanalargar en el tiempo lo máximo posible.

Es decir, ellos hacen inversiones de 2, 3ó 4 años para hacer un producto, y gene-ralmente su ciclo de cambio generacio-nal es bastante largo, estamos hablandode 6-7 años. Me estoy enfrentando con-cretamente a migraciones de productosde hace 6-7 años que están en C++ oVisual Basic. Y a la gran mayoría de losISV que están viendo la tecnología lesgusta, obviamente ven el valor que tiene,pero no es una adopción muy sencilla encuanto que les supone un gran cambiogeneracional. Entonces, hay que esperarmás a un rediseño completo de la aplica-ción. Sin embargo, en empresas de desa-rrollo que hacen trabajos “llave en mano”,ahí sí que indudablemente habrá unaadopción más inmediata.Había algún comentario sobre la ido-neidad del código que se genera “pordebajo” con LINQ to SQL. Es decir,

dotN

etM

anía

<<

13

dnm.directo.entrevista<<

José Murillo con Octavio Hernández en el pasado TechDays.

José Murillo con Marino Posadas en un momento de la entrevista

Page 14: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

14

dnm.directo.entrevista<<

si yo creo una consulta LINQ, ¿quése le está pidiendo realmente al ser-vidor SQL Server?

Es complicado. Porque no es fácildesarrollar un sistema que pueda satisfa-cer las necesidades de muchos clientes yque esté optimizado para un conjunto deescenarios completo. Aún así, yo sé queel grupo de producto ha hecho un granesfuerzo en adaptarse a las mejores prác-ticas, pero la verdad es que el tema de laoptimización es un tema del que se estáhablando bastante. De hecho, en el blogdel grupo de producto de ADO.NET hayun post muy bueno donde se detalla exac-tamente cuáles son las fases por las quepasa una consulta desde el momento enel que se genera hasta que llega al motorde base de datos. Y ahí hay consejos muybuenos que te harán aumentar ese rendi-miento, como usar consultas precompi-ladas, acceder a procedimientos almace-nados propietarios en un momento dado,etc. Pero indudablemente habrá situa-ciones en las que un experto, en un esce-nario concreto, podría generar una con-sulta SQL más eficiente. Aún así yoconfío, por lo visto y por la experienciade algunos clientes, que la calidad de lasconsultas generadas es más que suficien-te y muy similar a la que muchos clientessuelen obtener manualmente.

En el momento en que se añade unanueva capa de abstracción, todos espe-ramos que haya una penalización en elrendimiento; lo que se está intentandoes que esta penalización sea mínima,obviamente, y que el balance con res-pecto a la productividad y otros benefi-cios haga que ni siquiera se planteendudas en cuanto a la conveniencia de usarla tecnología.¿Por qué crees que se decidió queLINQ to SQL solo estuviera disponi-ble para SQL Server? ¿No piensas queeso limita su adopción?

Yo creo que ahí hahabido un problema detiempo, pero tambiénotro gran motivo ha sidoel de dejar que los fabri-cantes de bases de datoshagan sus propios adap-tadores, ajustados enrendimiento a sus pro-pios motores.¿Eso se está haciendo?

Sí, de hecho hay unacuerdo, por ejemplo,con IBM, que está desa-rrollando su propio pro-veedor con nuestrosoporte. Es decir, nues-tra postura es dar el

soporte necesario a los fabricantes queestán implementando sus proveedores (heestado consultando en Internet y hay másde una decena), ya que éstos van a gene-rar sentencias optimizadas para su motor.Con lo cual el motor de datos,además, no tiene por qué quedarseen motor de bases de datos relacio-nales, o sea, que pueden ser datos deorígenes diversos…

De hecho, hace poco he estado pro-bando un proveedor LINQ para LDAPy otro muy curioso que ha salido paraTwitter, para una Web 2.0.Resumiendo este punto, ¿crees quese irán incorporando a próximas ver-siones del Framework otros nuevosproveedores? ¿O se va a seguir esapolítica de que cada proveedor sedesarrolle el suyo?

Que yo sepa, no hay planificado quese vayan a incorporar más proveedorespor nuestra parte. La voluntad es la deapoyar a los desarrolladores para que cre-en los suyos.Bueno, pues vamos con Entity Fra-mework. Vamos a definirlo primero,que todavía a día de hoy es bastantedesconocido para el gran público.

Básicamente, lo que nos aporta EntityFramework es una capa de abstracciónpor encima de la base de datos que nosfacilita muchísimo el modelo de desarro-llo contra la base de datos. Eso lo hace

Page 15: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

15

dnm.directo.entrevista<<

también LINQ to SQL, pero la gran dife-rencia es que Entity Framework intro-duce un modelo conceptual. LINQ toSQL crea una representación de objetosque te hacen muy sencillo, desde el pun-to de vista de código, atacar a la base dedatos, pero estamos hablando de una rela-ción 1:1 entre lo que él te crea y lo quehay en la base de datos. Hay aplicacionesempresariales que necesitan tener desdeel modelo de programación una vista dife-rente, de un nivel conceptual más alto, dela que se obtiene directamente la base dedatos. Entity Framework agrega esa capade abstracción. El papel que juega Entity Frameworken la estrategia de acceso a datos esel de sustituir totalmente en un futu-ro próximo a los mecanismos de acce-so a datos actuales. Es decir, ¿Micro-soft ha apostado por Entity Frame-work como la manera correcta deacceder a los datos?

Yo creo que cada una de las técnicasva a tener su sitio. Al fin y al cabo, LINQto SQL y Entity Framework se apoyanen ADO.NET y dependiendo de lasnecesidades nos vamos a poder ir a unacapa de abstracción u otra.¿En qué escenarios me recomiendasusar Entity Framework y qué esce-nario sería para LINQ to SQL?

Las propias diferencias nos harándecantarnos entre uno y otro. Es decir,cuando estemos hablando de poder teneruna aplicación que se conecte a diferen-tes motores de bases de datos, eso yadirectamente nos va a llevar al Entity Fra-mework. Cuando estemos hablando demodelos de datos complejos sobre elmodelo relacional, pues ahí encaja tam-bién, porque no hay otra alternativa. Peropara aplicaciones más lineales, cuandoqueramos tenemos más control sobre labase de datos, que sean menos complejasen cuanto al número de tablas, encaja per-fectamente LINQ to SQL. No he hechocomparativas de rendimiento, aunquepuede ser que Entity Framework sea unpoco más pesado, ya que tiene un nivelde abstracción más por el que hay quepasar.

¿Y tiene cabida todavía ADO.NET3.5 como única herramienta de acce-so a datos, sin LINQ to SQL ni EntityFramework?

Yo es que incluso cuando tengo quehacer un ejemplo de acceso a una tabla,desde el punto de vista de la productivi-dad, ya se me va la mano hacia LINQ toSQL, porque es bastante más sencillo. Yocreo que, si acaso, podría quedar un esce-nario para el uso directo de ADO.NET:donde se necesite un código con muy altonivel de rendimiento. Pero sería en casosmuy puntuales. Sería como usar C++ nomanejado, en lugar de C# o VB…Hay un tema que me interesa muchoúltimamente, y sobre el que estoyescribiendo ahora, que es Silverlight;concretamente, el tema del acceso adatos desde Silverlight. Ya sabes quehay varias formas: puedes usar los ser-vicios Web clásicos, LINQ, WCF y,la cuarta opción, que parece ser lamás prometedora y se presenta a lagente de la forma que se presentaEntity Framework, es Astoria…

Astoria es aún algo incierto ahora mis-mo, en el sentido de que la última versiónfue del año pasado, de 2007; una versiónque el grupo de desarrollo expuso comoprueba de concepto, para recoger requi-sitos y demás. Yo creo que la acogida que

tuvo fue muy buena, sobre todo asocia-da con aplicaciones Silverlight y AJAX, ypor eso ahora mismo se está reescribien-do desde cero. Tenemos esperanzas deque salga en breve, aunque su objetivo esdiferente al de Entity Framework yLINQ to SQL, en el sentido de que aéstos yo los encajo más como tecnologíaspara acceder desde la lógica de negocio ala base de datos, mientras que para míAstoria encaja mejor en situaciones en lasque tengo que acceder a la base de datosdirectamente desde la interfaz de usua-rio, sin pasar por lógica de negocio, víapeticiones REST sobre HTTP.Por último, hablando de acceso adatos, ¿hay algo importante que quie-ras añadir? ¿Cuál es el roadmap futu-ro de todo esto?

Yo creo que se abre un horizonte bas-tante bueno, en el sentido de que hastaahora no teníamos nada parecido a estastecnologías, el acceso a datos era un pro-ceso muy manual, muy artesanal. Yo ani-maría a todo el mundo a probarlas, yespecialmente a los que empiecen undesarrollo nuevo; pero teniendo en cuen-ta los plazos, en el caso de Entity Fra-mework, que todavía no está en la calle.Para su salida aún no hay fecha oficial,aunque todo parece indicar que será enlos próximos meses.

Page 16: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

En nuestra entrega anterior introdujimos el temade las relaciones entre clases y su modelado en elMarco de entidades, presentando una aplicaciónde los tipos complejos a la implementación demodelos de relaciones 1:1. Aquí nos centraremosen los recursos que nos ofrece el Marco de enti-dades para el modelado de relaciones 1:n y m:n,tan comunes en el mundo real.

El modelo de datos inicialPara presentar los mecanismos de implementa-ción de relaciones, partiremos de una base de datosque es realmente un modelo extendido de la basede datos FUTBOL2006 del libro “C# 3.0 y LINQ”[2]. Un diagrama de este modelo extendido se pre-senta en la figura 1.

Una nueva tabla base, Campaña, se ha añadidopara dar dimensión temporal a la base de datos ycapturar la participación de los clubes y jugadoresindividuales en las diferentes campañas de la 1ªdivisión del fútbol español. Para implementar lasrelaciones entre las tablas base, se dispone de dostípicas tablas “puente”, Club_Campaña y Futbolis-ta_Campaña. Observe que, a diferencia de Club_Cam-paña, que solo tiene los dos campos correspon-dientes a las claves foráneas de cada una de lastablas relacionadas, la tabla Futbolista_Campaña

contiene una tercera columna con información adi-cional, en este caso el código del club en el que el fut-bolista jugó durante la campaña (Id_Club). A estascolumnas adicionales asociadas a las relaciones se lesdenomina genéricamente en la documentación rela-

El Marco de trabajo de entidades de ADO.NET v3.5 (V)

plataforma.net

Unai Zorrilla esDevelopment Team

Leader de Plain Conceptsy tutor de campusMVP.

MVP desde 2004,colabora activamente con

Microsoft en eventos dearquitectura y

desarrollo, así como engiras de productos. Autor

del libro "Modelandoprocesos de negocio con

Workflow Foundation".

Octavio Hernández esMentoring Team Leader

de Plain Concepts, editortécnico de dotNetManía y

tutor de campusMVP. Es MVP de C# desde2004, MCSD y MCT.

Autor del libro "C# 3.0 yLINQ".

Continuando con nuestra serie dedicada a presentar las posibilidadesque ofrecerá el Marco de entidades de ADO.NET 3.5 para el desarro-llo de modelos conceptuales de entidades mapeados a modelos rela-cionales de bases de datos [1], en esta entrega hablaremos sobre losmecanismos que tendremos a nuestra disposición para expresar lasrelaciones entre entidades.

Unai ZorrillaOctavio Hernández

Figura 1. Diagrama de la base de datos de ejemplo

Page 17: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

17

dnm.plataforma.net<<

cionada con el Marco de entidades comocarga adicional (payload).

Lo primero que haremos será cre-ar, en el contexto de una nueva aplica-ción Windows Forms, un modelo dedatos de entidades (“Agregar” | “Nue-vo elemento” | “Modelo de datos deentidades”). Después de indicar la basede datos y seleccionar todas las tablas,obtendremos un resultado similar al quemuestra la figura 2.

Las relaciones en el Marco deentidadesDel mismo modo que las entidades, lasrelaciones o asociaciones son un ele-mento de primera clase en los modelosconceptuales. Al importar un modelorelacional, el generador de modelos escapaz de inferir aspectos tales como lamultiplicidad (cardinalidad) de las rela-ciones a partir de los metadatos corres-pondientes de la base de datos. Porejemplo, el listado 1 presenta un frag-mento del modelo conceptual (CSDL)correspondiente a la entidad Futbolis-ta y las relaciones asociadas a ella.

Además de reflejar la estructurade las asociaciones, el modelo con-ceptual generado incluye en las enti-dades afectadas (y, por supuesto, enel código de las clases correspon-dientes) lo que se conoce como pro-

piedades de navegación: propie-dades que permiten, a partir decualquier instancia de la entidad,navegar hacia los elementos aso-ciados en el otro extremo de la rela-ción. Por ejemplo, el listado 2muestra cómo para la clase Futbo-lista se crea una propiedad Pais-Reference, de tipo EntityReferen-ce<Pais>, que devuelve una refe-rencia al país de nacimiento del fut-bolista, además de un sinónimo másdirecto de la anterior, llamada sim-plemente Pais. Por el otro lado, laclase Pais ofrece una propiedadFutbolista, de tipo EntityCollec-tion<Futbolista>, que devuelve unacolección de los futbolistas nacidosen el país concreto.

<EntityType Name=”Futbolista”><Key><PropertyRef Name=”Id” />

</Key><Property Name=”Id” Type=”Int32” Nullable=”false” /><Property Name=”Nombre” Type=”String” Nullable=”false”

MaxLength=”75” Unicode=”false” /><Property Name=”Sexo” Type=”String” Nullable=”false”

MaxLength=”1” Unicode=”false” FixedLength=”true” /><Property Name=”FechaNacimiento” Type=”DateTime” /><Property Name=”Posicion” Type=”String”

MaxLength=”1” Unicode=”false” FixedLength=”true” /><NavigationProperty Name=”Futbolista_Campaña”

Relationship=”FUTBOLModel.FK_Futbolista_Campaña_Futbolista”FromRole=”Futbolista” ToRole=”Futbolista_Campaña” />

<NavigationProperty Name=”Pais”Relationship=”FUTBOLModel.FK_Futbolista_Pais”FromRole=”Futbolista” ToRole=”Pais” />

</EntityType><Association Name=”FK_Futbolista_Campaña_Futbolista”><End Role=”Futbolista” Type=”FUTBOLModel.Futbolista” Multiplicity=”1” /><End Role=”Futbolista_Campaña” Type=”FUTBOLModel.Futbolista_Campaña”

Multiplicity=”*” /><ReferentialConstraint><Principal Role=”Futbolista”><PropertyRef Name=”Id” />

</Principal><Dependent Role=”Futbolista_Campaña”><PropertyRef Name=”Id_Futbolista” />

</Dependent></ReferentialConstraint>

</Association><Association Name=”FK_Futbolista_Pais”><End Role=”Pais” Type=”FUTBOLModel.Pais” Multiplicity=”1”><!— añadido manualmente —><OnDelete Action=”Cascade” />

</End><End Role=”Futbolista” Type=”FUTBOLModel.Futbolista” Multiplicity=”*” />

</Association>

Listado 1. Fragmento del modelo conceptual de la figura 2.

Figura 2. Modelo de datos de entidades generado automáticamente.

Page 18: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

18

dnm.plataforma.net<<

Las clases EntityReference<T> y EntityCollection<T>del Marco de entidades guardan, en general, bastantesimilitud con las clases EntityRef<T> y EntitySet<T> deLINQ to SQL; vea el artículo “Clases de entidad enLINQ to SQL” en este mismo ejemplar. Pero ¡cuidado!:hay diferencias de comportamiento que no es posibleignorar. En general, el Marco de entidades se orienta, enaras de la eficiencia, hacia la carga explícita de las pro-piedades de navegación por parte del programador; porejemplo, el código que se muestra en el listado 3 no fun-

cionará sin la llamada a Futbolista.Load(). No obstan-te, ello no es necesario en el caso de las consultas LINQ(listado 4), que se evalúan en la base de datos y para lascuales las propiedades de navegación actúan como susti-tutas de expresiones de navegación más complejas.

Actualización de relacionesEn el caso de relaciones 1:1, 1:n e incluso m:n (siem-pre que no lleven carga adicional, como veremos másadelante), el Marco de entidades suministra las facili-dades necesarias para las inserciones, modificacioneso borrados. Por ejemplo, el listado 5 muestra la inser-ción de un país con sus futbolistas. Al llamar al méto-do SaveChanges() del contexto, se generan las senten-

public partial class Futbolista: EntityObject{

// ...// *** Propiedad de navegación.[EdmRelationshipNavigationPropertyAttribute(

“FUTBOLModel”, “FK_Futbolista_Pais”, “Pais”)][System.Xml.Serialization.XmlIgnoreAttribute()][System.Xml.Serialization.SoapIgnoreAttribute()][System.ComponentModel.BrowsableAttribute(false)]public Pais Pais{

get{

// ...}set{

// ...}

}

[System.Runtime.Serialization.DataMemberAttribute()][System.ComponentModel.BrowsableAttribute(false)]public EntityReference<Pais> PaisReference{

get{

// ...}set{

// ...}

}}

public partial class Pais: EntityObject{

// ...// *** Propiedad de navegación.[EdmRelationshipNavigationPropertyAttribute(“FUTBOLModel”, “FK_Futbolista_Pais”, “Futbolista”)]

[System.Xml.Serialization.XmlIgnoreAttribute()][System.Xml.Serialization.SoapIgnoreAttribute()][System.ComponentModel.BrowsableAttribute(false)]public EntityCollection<Futbolista> Futbolista{

get{

// ...}

}}

using (FUTBOLEntities ctx = new FUTBOLEntities()){var ff = from p in ctx.Pais

where p.Codigo == “FR”from f in p.Futbolistaselect new{

Jugador = f.Nombre,Pais = p.Nombre

};foreach (var f in ff)listBox1.Items.Add(f.Jugador + “ (“ + f.Pais + “)”);

}

Listado 2. Fragmento del código generado para el modeloconceptual de la figura 2.

Listado 4. Consulta de LINQ to Entities.

using (FUTBOLEntities ctx = new FUTBOLEntities()){

// inserciónPais p = Pais.CreatePais(“MC”, “Macondo”);Futbolista f1 = Futbolista.CreateFutbolista(0, “Pablo Peláez”);

Futbolista f2 =Futbolista.CreateFutbolista(0, “Aureliano Buendía”);

p.Futbolista.Add(f1); p.Futbolista.Add(f2);ctx.AddToPais(p);//ctx.SaveChanges(); // envía los cambios a la BB.DD.

}

Listado 5. Inserción de datos relacionados.

using (FUTBOLEntities ctx = new FUTBOLEntities()){var laFrance = ctx.Pais.First(p => p.Codigo==“FR”);

// ¡cargar datos de la relación!laFrance.Futbolista.Load(); foreach (Futbolista f in laFrance.Futbolista)

listBox1.Items.Add(f.Nombre);}

Listado 3. Carga explícita de propiedades de navegación.

Page 19: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

19

dnm.plataforma.net<<

cias SQL necesarias para la inserción del país y losfutbolistas en las tablas correspondientes.

Por otra parte, el listado 6 muestra cómo imple-mentar el borrado en cascada de un país y sus fut-bolistas. Observe aquí el uso de Include, un méto-do extensor de ObjectQuery, que nos permite orde-nar la carga explícita de la relación asociada a la pro-piedad de navegación Futbolista, gracias a lo cual,cuando el Marco de entidades vaya a eliminar el paíspodrá disponer dentro del contexto de los futbolis-tas relacionados, y en base a ellos construir las sen-tencias de borrado necesarias. El comportamientode borrado en cascada para la relación se ha confi-gurado de manera declarativa en el modelo con-ceptual (línea resaltada del listado 2).

Se invita al lector a comprobar todo lo que deci-mos aquí utilizando el código del ejemplo, que pue-de descargar de www.dotnetmania.com, y un buen alia-do en estas tareas, el SQL Server Profiler.

Relaciones m:n y el problema de la cargaadicional

A diferencia de LINQ to SQL, el Marco de enti-dades de ADO.NET sí ofrece una implementación“de cero programación” para las relaciones “muchosa muchos” (incluyendo incluso las facilidades de actua-lización), siempre que éstas no lleven carga adicionalasociada. En nuestro modelo de ejemplo, existe unarelación de tal naturaleza entre las entidades Campañay Club (en una campaña participan múltiples clubes,un club ha participado en múltiples campañas). Obser-

ve en la figura 2 cómo el asistente, al importar elmodelo relacional, detecta la relación m:n y no creauna entidad para la tabla-puente, además de generardirectamente las propiedades de navegación que per-miten ir de una campaña a sus clubes y de un club asus campañas.

Sin embargo, observe que el comportamiento pre-determinado del asistente en el caso de la relación (enprincipio, también m:n) entre Campaña y Futbolistaha sido diferente. Aquí se ha creado una entidad Fut-bolista_Campaña, y para navegar de un futbolista a lascampañas en que ha participado tendremos que usaresa entidad como “pasarela”: f.Futbolista_Cam-paña.Campaña (donde f es de tipo Futbolista). Lo másincómodo de esto es que para realizar actualizacionesserá necesario hacerlo también a través de esa enti-dad-puente.

El motivo de este comportamiento diferente delMarco de entidades radica en que la relación en cues-tión conlleva una carga adicional, en este caso el clubdel que el futbolista formó parte durante la cam-paña. Para asociar un futbolista a una campaña, nobastaría con indicar su clave primaria; también habríaque especificar el club del que formó parte, o tal vezindicar que se desea asignar al club un valor pordefecto o el valor NULL. En vista de estas múlti-ples alternativas, el equipo de desarrollo tomó ladecisión salomónica de “no mojarse” (al menos enesta primera versión). Aunque sí están abiertas laspuertas para que los desarrolladores implementensus propias soluciones particulares, que ya salen delalcance de este artículo, tanto a nivel de modelo con-ceptual (modificando directamente el archivo CSDL)como utilizando los métodos parciales que las cla-ses generadas ofrecen.

ConclusionesEn este artículo hemos mostrado, de una mane-

ra muy resumida, las principales posibilidades queofrecerá el Marco de entidades de ADO.NET paramodelar las relaciones entre entidades y facilitar sutratamiento programático desde código escrito en C#o Visual Basic.

using (FUTBOLEntities ctx = new FUTBOLEntities()){

// borrado en cascadavar mc = ctx.Pais.Include(“Futbolista”).

First(p => p.Codigo == “MC”);ctx.DeleteObject(mc);// envía los cambios a la BB.DD.ctx.SaveChanges();

}

Listado 6. Borrado de datos relacionados.

BibliografíaZorrilla, U. y Hernández, O. “El Marco de trabajo de entidades de ADO.NET 3.5” (partes I a IV), endotNetManía nº 44-48, enero-abril de 2007.

Hernández, O. “C# 3.0 y LINQ”, Krasis Press, octubre de 2007.

Blog del equipo de ADO.NET Entity Framework, en http://blogs.msdn.com/adonet/.

[1]

[2][3]

Page 20: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Relaciones entre objetos

Una de las cualidades más interesantes del mode-lo orientado a objetos, del cual C# es actualmen-te el mejor exponente, es la transparencia en lasreferencias entre objetos y la facilidad para “nave-gar” entre objetos mediante la notación conocidacomo dot notation (notación de punto).

El listado 1 nos muestra un simplificado esque-ma de clases para expresar información sobre cine.La clase Genre representa la información sobre ungénero cinematográfico, la clase Film representainformación sobre una película, la clase Directorsobre directores y la clase Actor sobre actores.

Note que hay una relación uno a uno entreFilm y Director y entre Film y Genre. Las respecti-vas propiedades Director y Genre que tiene el tipoFilm nos indican que un film tiene un director ytiene un género1. A su vez hay una relación uno amuchos entre Genre y Film y entre Director y Film,pues un director puede haber dirigido más de unfilm y porque existe más de un film de un mismogénero; esto se expresa mediante las propiedadesFilms de Director y de Genre, las cuales se han defi-nido de tipo List<Film>.

También hay una relación muchos a muchosentre Film y Actor, establecida por las respectivaspropiedades Actors y Films, ya que en un film tra-bajan varios actores y un actor trabaja en variosfilms.

La notación transparente a través de referen-cias del modelo de objetos (que en el caso de C#es la que se aplica de manera predeterminada) per-mite de manera sencilla “navegar” de un objeto aotro. El listado 2 nos muestra diferentes formasde listar el título y el género de los films dirigidospor Steven Spielberg.

Note que dentro del primer bucle del listado2 hay una navegación de un film a un director parapoder acceder al nombre de éste y una navegaciónde un film a un género para obtener el nombre delgénero. En el segundo bucle hay una navegaciónde un director a los films dirigidos por éste paraobtener el título de los mismos, y una navegaciónde un film a un género para obtener el nombre delgénero.

Una de las genialidades de LINQ2 es la senci-llez con que permite que consultas como las dellistado 2 puedan expresarse de manera declarati-va (listado 3).

Clases de entidad en

LINQ to SQL

plataforma.net

Miguel Katrib es doctor yprofesor jefe de progra-

mación del departamentode Ciencia de la Compu-tación de la Universidadde La Habana. Miguel eslíder del grupo WEBOO,dedicado a la orientacióna objetos y la programa-ción en la Web. Es entu-

siasta de .NET y redactorde ddotNetManía.

Este artículo explica cómo las clases de entidad que LINQ to SQL gene-ra para hacer el mapeo entre una base de datos SQL y objetos en memo-ria expresan de manera sencilla las relaciones uno a uno y unoa muchos que existen en el diseño de las tablas relacionales. El trabajomuestra también cómo podemos, de un modo no invasivo, ampliar elcódigo de mapeo para poder expresar relaciones muchos a muchos quenos harán más simple la programación.

Miguel Katrib Mora

1 Pedimos disculpas por la simplificación a aquellos cinéfilos que saben que un film puede tener varios directores y puedeser catalogado en varios géneros.

2 El lector que aún no conozca nada sobre LINQ puede consultar en [1] y [3] o en los artículos introductorios a estatecnología publicados tempranamente en dotNetManía por el colega Octavio Hernández [2].

Page 21: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

LINQ to SQL es el proveedor deLINQ que permite ejecutar consultas simi-lares a las del listado 3 contra una base dedatos relacional SQL. En lo que sigue deeste artículo veremos cómo LINQ to SQLcaptura estas relaciones “uno a uno” y “unoa muchos” cuando la fuente de datos noson estructuras de objetos en memoria, sinotablas de una base de datos SQL. Se verátambién cuáles son las limitaciones paraexpresar relaciones muchos a muchos y sepresenta una propuesta para sortear estaslimitaciones.

Mapeo entre objetos y unabase de datos relacional enLINQ to SQL

La figura 1 nos presenta el conjunto detablas de una simplificada base de datosrelacional para expresar información decine.

Observe que estas tablas relacionalesno corresponden exactamente con lostipos definidos en el epígrafe anterior.En las tablas relacionales los tipos de las

dotN

etM

anía

<<

21

dnm.plataforma.net<<

class Genre {public string Name { get; }public List<Film> Films { get; set; }//...}

class Film {public string Title { get; set; }public Genre Genre { get; set; }public Director Director { get; set; }public List<Actor> Actors { get; set; }//...}

class Director {public string Name { get; set; }public List<Film> Films { get; set;}//...}

class Actor {public string Name { get; set; }public List<Film> Films { get; set;}//...}

class CineDB {public List<Film> Films { get; set;}}public List<Director> Directors{get; set;}public List<Genre> Genres { get; set;}public List<Actor> Actores { get; set;}//...}

CineDB miBaseDeObjetos = new CineDB();//...foreach (Film f in miBaseDeObjetos.Films) {if (f.Director.Name == “Steven Spielberg”)Console.WriteLine(“{0} {1}”, f.Title, f.Genre.Name);

}

foreach (Director d in miBaseDeObjetos.Directors) {if (d.Name == “Steven Spielberg”) {foreach (Film f in d.Films)Console.WriteLine(“{0} {1}”, f.Title, f.Genre.Name);

}

Listado 1. Clases de cine en C#.

Listado 2. Consultas en notación imperativa de objetos.

CineDB miBaseDeDatos = new CineDB();//...var filmsDeSpielberg1 =

from f in cineDB.Filmswhere f.Director.Name == “Steven Spielberg”select new { f.Title, Genre = f.Genre.Name };

var filmsDeSpielberg2 =from d in cineDB.Directorsfrom f in d.Filmswhere d.Name == “Steven Spielberg”select new { f.Title, f.Name };

Listado 3. Consultas en notación declarativa con LINQ.

Page 22: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

columnas son simples, es decir, el valorde una columna en una fila (tupla) rela-cional no puede ser un objeto comple-jo, ni mucho menos una colección deobjetos como se expresaba con las cla-ses definidas en la sección anterior. Lasque serían relaciones entre objetos secapturan en el modelo relacionalmediante el uso de claves primarias yforáneas. Note por ejemplo que una filade la tabla Film no tiene una columnacon valores de tipo Director; en su lugar,esto se ha modelado especificando unacolumna IdDirector que hace de claveforánea hacia la tabla Director.

Cuando se añade un elementoLINQ to SQL Classes a un proyec-to VS2008 (figura 2), se crea un con-texto de datos asociado a una conexióna una base de datos SQL Server; alarrastrar las tablas de esa base de datosal área de diseño de VS2008, éste gene-ra y añade al proyecto el código fuen-te C# necesario para expresar el mapeo,en notación de objetos, de esas tablasrelacionales. Este código es el que seencarga por detrás de hacer todo el tra-bajo de fontanería necesario para lainteracción con el motor de la base dedatos. Se sale del alcance y espacio deun artículo analizar en profundidadtodo este código de mapeo. En lo ade-lante, se mostrará solamente cómo lasrelaciones entre las tablas quedanexpresadas en C# como relacionesentre objetos, mediante lo que se deno-mina clases de entidad.

EntityRef y relaciones uno a unoGracias a este código de mapeo, con-sultas declarativas con notación de obje-tos como la del listado 3 podrán apli-carse a datos relacionales, como semuestra en el listado 4.

Observe que en la tabla original Filmde la figura 1 no hay una columna denombre Director que tenga como valorun objeto de tipo Director, ni unacolumna Genre que tenga como valorun objeto de tipo Genre. Sin embargo,en la consulta del listado 4 se ha podi-do escribir f.Director.Name y f.Gen-re.Name; esto se hace posible gracias alas relaciones de tipo EntityRef que seutilizan en el código de mapeo. Unextracto del código de mapeo con latabla Film se muestra en el listado 5. Laclase Film es la que mapea la tabla Film;note que las propiedades Director y Gen-re utilizan respectivamente las variables

_Director y _Genre, que son de tipoEntityRef<Director> y EntityRef<Genre>respectivamente. Al aplicarle la pro-piedad Entity a un valor de estos tiposEntityRef se obtienen objetos de tipoDirector y Genre.

Como estas propiedades de tipoEntityRef no corresponden directa-mente con columnas de la base de datos,es LINQ to SQL el que encarga detransformar estas consultas a sentenciasSQL que pasa al motor de la base dedatos. El listado 6 nos muestra el códi-go SQL que se le pasa al motor de SQLServer en el caso de la consulta del lis-tado 4. Note que la simple notaciónf.Director.Name y f.Genre.Name se tra-duce en operaciones de encuentro (join)entre las tablas (pero eso es transparenteal desarrollador).

Un aspecto relevante a destacar es queeste tipo EntityRef se encarga de mante-ner la identidad de los objetos. A pesar deque en el listado 7 se hacen dos consultas

dotN

etM

anía

<<

22

dnm.plataforma.net<<

Figura 1. Esquema de tablas en SQL Server 2005.

Figura 2. Añadiendo un elemento LINQ to SQL Classes al proyecto.

CineDBDataContext cineDB = new CineDBDataContext();//...var filmsDeSpielberg =

from f in cineDB.Filmswhere f.Director.Name == “Steven Spielberg”select new { f.Title, Genre = f.Genre.Name };

Console.WriteLine(“Título y género de los films de Spielberg\n”);foreach (var f in filmsDeSpielberg){Console.WriteLine(“{0} {1}”, f.Title, f.Genre);

}

Listado 4. Consulta con relaciones uno a uno entre tablas.

Page 23: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

23

dnm.plataforma.net<<

diferentes, el objeto Director obtenido en ambos casosserá el mismo (la comparación del listado 7 dará comoresultado true). El mecanismo de EntityRef garantizaque ambas consultas producen el mismo objeto de tipoDirector, que corresponde a una misma fila en la tablaDirector. Al cambiar a mayúscula (usando la notación deobjetos) el nombre del director de “Jurassic Park” y hacercineDB.SubmitChanges(), se está cambiando la fila de latabla Director correspondiente a Steven Spielberg.

EntitySet y relaciones uno a muchosEl código de mapeo establece también relaciones unoa muchos entre Director y Film y entre Genre y Film,lo que se expresa mediante el tipo EntitySet. Note,en el extracto de código del listado 8, que las varia-

SELECT [t0].[Title], [t2].[Name] AS [Genre]

FROM [dbo].[Film] AS [t0]

LEFT OUTER JOIN [dbo].[Director]

AS [t1] ON [t1].[Id] = [t0].[IdDirector]

INNER JOIN [dbo].[Genre]

AS [t2] ON [t2].[Id] = [t0].[IdGenre]

WHERE [t1].[Name] = @p0

— @p0: Input NVarChar (Size = 16; Prec = 0; Scale = 0)

[Steven Spielberg]

— Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8

Listado 6. Código SQL generado para la consulta del listado 4.

CineDBDataContext = new CineDBDataContext();var spielberg =

(from d in cineDB.Directorswhere d.Name == “Steven Spielberg”select d).First();

var jurassicPark =(from f in cineDB.Filmswhere f.Title == “Jurassic Park”select f).Single();

Console.WriteLine(“spielberg y el director de jurassicPark son iguales: {0}”,spielberg == jurassicPark.Director);

jurassicPark.Director.Name = jurassicPark.Director.Name.ToUpper();cineDB.SubmitChanges();

Listado 7. Identidad de los objetos.

[Table(Name=”dbo.Director”)]public partial class Director : INotifyPropertyChanging,

INotifyPropertyChanged {//...private EntitySet<Film> _Films;//...[Association(Name=”Director_Film”, Storage=”_Films”, OtherKey=”IdDirector”)]public EntitySet<Film> Films {get {

return this._Films;}set {

this._Films.Assign(value);}

}//...

}

[Table(Name=”dbo.Genre”)]public partial class Director : INotifyPropertyChanging,

INotifyPropertyChanged {//...private EntitySet<Film> _Films;//...[Association(Name=”Genre_Film”, Storage=”_Films”, OtherKey=”IdGenre”)]public EntitySet<Film> Films {get {

return this._Films;}set {

this._Films.Assign(value);}

}//...

}

Listado 8. Relaciones uno a muchos entre tablas.

[Table(Name=”dbo.Film”)]public partial class Film : INotifyPropertyChanging,

INotifyPropertyChanged {private int _Id;private string _Title;private int _IdGenre;private System.Nullable<int> _IdDirector;//...private EntitySet<FilmActor> _FilmActors;private EntityRef<Director> _Director;private EntityRef<Genre> _Genre;private EntitySet<FilmActor> _FilmActors;private EntityRef<Director> _Director;private EntityRef<Genre> _Genre;//...[Association(Name=”Director_Film”, Storage=”_Director”,

ThisKey=”IdDirector”, IsForeignKey=true)]public Director Director {get {return this._Director.Entity;

}set {//...

}}

[Association(Name=”Genre_Film”, Storage=”_Genre”, ThisKey=”IdGenre”, IsForeignKey=true)]

public Genre Genre {get {return this._Genre.Entity;

}set {//...

}}

Listado 5. Relaciones uno a uno entre tablas.

Page 24: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

24

dnm.plataforma.net<<

bles _Films de los tipos Director y Gen-re son de tipo EntitySet<Film>.

Esto permite que se pueda hacer unaconsulta como la del listado 9, que usauna de estas relaciones uno a muchos alescribir d.Films. Usando la propiedadFilms de Director se averigua fácilmentequé directores han dirigido algún film delgénero “Mafia”. El resultado es el que semuestra en el listado 10.

LINQ to SQL se encarga de quese preserve en la base de datos la con-sistencia de estas relaciones uno amuchos si se hacen operaciones con losobjetos en memoria. El código del lis-tado 11 usa la propiedad Films del obje-to coppola, que representa a la fila enla tabla Director correspondiente aldirector Francis Ford Coppola; alañadirle a esta propiedad el objetogoodfellas de tipo Film, se provoca asu vez que se actualice la propiedadDirector de tipo EntityRef<Director>del objeto goodfellas.

Si ahora se accede de nuevo a la basede datos para listar los films dirigidospor Coppola, se podrá observar que“Goodfellas” está entre ellos (listado 12).

Relaciones muchos a muchosUna relación muchos a muchos, comola que puede haber entre filmes y acto-

res, suele expresarse en el modelo rela-cional mediante la adición de un terce-ra tabla. Note en la figura 1 que la tablaFilmActors tiene una columna IdFilmque es clave foránea hacia la tabla Film,y una columna IdActor que es clave forá-nea hacia la tabla Actor.

LINQ to SQL expresa ese mapeoincluyendo una propiedad FilmActorsen Films y otra en Actors (listado 13).

Es a través de estas propiedades FilmActors que a partir de un actor podemostener acceso a todos los films en que éstetrabaja y dado un film podemos tener acce-so a todos los actores que trabajan en dichofilm. La consulta del listado 14 nos da losfilms dirigidos por Clint Eastwood y susactores, y los films en los que actúa Dus-tin Hoffman. Note cómo la tabla Fil-mActors y la propiedad FilmActors se hanutilizado como puente para navegar entreun film y el nombre de los actores y entreun actor y los títulos de los films.

CineDBDataContext cineDB = new CineDBDataContext();var mafia = from d in cineDB.Directors

from f in d.Filmswhere f.Genre.Name == “Mafia”select new { Director=d.Name, f.Title };

Console.WriteLine(“Films de Mafia y sus directores\n”);foreach (var f in mafia)Console.WriteLine(“{0,-30} {1}”, f.Title, f.Director);

Listado 9. Consulta usando EntitySet.

Films de Mafia y sus directores

Godfather Francis Ford CoppolaThe Untouchables Brian de PalmaGangs of New York Martin ScorseseGoodfellas Martin ScorseseThe Black Dahlia Brian de PalmaEastern Promises David Cronenberg

Listado 10. Salida producida por el código del listado 9.

Coppola y sus films

Godfather Francis Ford CoppolaGoodfellas Francis Ford Coppola

Listado 12. Salida producida por el código dellistado 11.

// Pone Goodfellas como film de Coppola y actualiza la base de datosDirector coppola = (from d in cineDB.Directors

where d.Name == “Francis Ford Coppola”select d).Single();

Film goodfellas = (from f in cineDB.Filmswhere f.Title == “Goodfellas”select f).Single();

coppola.Films.Add(goodfellas);cineDB.SubmitChanges();

// Accede de nuevo a la base de datos para listar los films de Coppolavar coppolaFilms = from f in cineDB.Films

where f.Director.Name == “Francis Ford Coppola”select f;

Console.WriteLine(“Coppola y sus films\n”);foreach (var f in coppolaFilms)Console.WriteLine(“{0,-30} {1}”, f.Title, f.Director.Name);

Listado 11. Añadiendo elementos a través del EntitySet.

LINQ to SQL se encarga deque se preserve en la base dedatos la consistencia de estasrelaciones uno a muchos si

se hacen operaciones con losobjetos en memoria

Page 25: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Hubiese sido deseable que LINQ to SQL incluyese una rela-ción muchos a muchos de forma directa entre Film y Actor; esdecir, tener en el tipo Film una propiedad Actors de tipo Entity-Set<Actor>, y tener a su vez en el tipo Actor una propiedad Filmsde tipo EntitySet<Film>. Las clases parciales del listado 15 nosmuestran cómo podemos ampliar las definiciones de Film y Actorpara este propósito.

Con la inclusión de estas propiedades, ahora las consultasdel listado 14 se pueden expresar como se muestra en el listado16; note que no ha sido necesario usar explícitamente FilmActorcomo puente. Observe que se ha implementado esto para queal construir inicialmente un EntitySet se indiquen los métodosonAdd y onRemove, de modo que éstos se ejecuten cuando se apli-quen las operaciones Add y Remove al EntitySet. Con estos dosmétodos logramos mantener la consistencia con el tipo FilmAc-tor, que es el que realmente hace el mapeo con la tabla corres-pondiente de la base de datos. Pruebe el lector a añadirle un actora un film o añadirle un film a la filmografía de un actor, y com-pruebe que si hace SubmitChanges los cambios se reflejarán en labase de datos.

En este ejemplo, las nuevas propiedades están usándoseen la cláusula select de ambas consultas. En este caso, el códi-go de la cláusula select no es transformado por LINQ toSQL en fragmentos de sentencias SQL, sino que es evalua-

[Table(Name=”dbo.Film”)]public partial class Film :

INotifyPropertyChanging, INotifyPropertyChanged {//...private EntitySet<FilmActor> _FilmActors;//...[Association(Name=”Film_FilmActor”, Storage=”_FilmActors”,

OtherKey=”IdFilm”)]public EntitySet<FilmActor> FilmActors {get {return this._FilmActors;

}set {this._FilmActors.Assign(value);

}}//...

}

[Table(Name=”dbo.Actor”)]public partial class Actor :

INotifyPropertyChanging, INotifyPropertyChanged {//...private EntitySet<FilmActor> _FilmActors;//...[Association(Name=”Actor_FilmActor”, Storage=”_FilmActors”,

OtherKey=”IdActor”)]public EntitySet<FilmActor> FilmActors {get {return this._FilmActors;

}set {this._FilmActors.Assign(value);

}}

}

public partial class Film : INotifyPropertyChanging, INotifyPropertyChanged {

private EntitySet<Actor> _Actors = null;private void onAdd(Actor a) {foreach (FilmActor fa in _FilmActors)if (fa.IdActor == a.Id && fa.IdFilm == _Id) return;

// Añadir una nueva relación FilmActor al EntitySet FilmActors FilmActor fActor = new FilmActor();fActor.IdFilm = Id; fActor.IdActor = a.Id;fActor.Actor = a; fActor.Film = this;_FilmActors.Add(fActor);return;

}private void onRemove(Actor a) {foreach (FilmActor fa in _FilmActors)// Quitar la entrada correspondiente en la // relación FilmActorsif (fa.IdActor == a.Id && fa.IdFilm == _Id) {_FilmActors.Remove(fa); return;

}return;

}// Nueva propiedad personalizada Actorspublic EntitySet<Actor> Actors {get {if (this._Actors == null) {this._Actors = new EntitySet<Actor>(

new Action<Actor>(onAdd), new Action<Actor>(onRemove));

foreach (FilmActor fa in this._FilmActors) this._Actors.Add(fa.Actor);

}return _Actors;

}set {this._Actors.Assign(value);}

}}

// Similar implementación a la anterior para la clase Actorpublic partial class Actor : INotifyPropertyChanging,

INotifyPropertyChanged {//...

}

Listado 15. Personalización para definir las relaciones muchos a muchos.

dnm.plataforma.net<<

CineDBDataContext cineDB = new CineDBDataContext();var clintFilms = from f in cineDB.Films

where f.Director.Name == “Clint Eastwood”select new { f.Title, f.FilmActors };

Console.WriteLine(“Films de Clint Eastwood y sus actores”);foreach (var f in clintFilms) {Console.WriteLine(“\n {0}”, f.Title);foreach (var fa in f.FilmActors)Console.WriteLine(“ {0}”, fa.Actor.Name);

}

var dustinFilms = (from a in cineDB.Actorswhere a.Name == “Dustin Hoffman”select new { a.FilmActors }).Single();

Console.WriteLine(“\nFilms en que trabaja Dustin Hoffman”);foreach (var fa in dustinFilms.FilmActors) {

Console.WriteLine(“ {0}”, fa.Film.Title);}

Listado 13. EntitySet FilmActor en Film y en Actor.

Listado 14. Uso del EntitySet FilmActors.

dotN

etM

anía

<<

25

Page 26: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

26

dnm.plataforma.net<<

do cuando los objetos resultantes de laconsulta vayan siendo procesados enmemoria.

Sin embargo, un código como el dellistado 17 daría excepción en ejecuciónporque LINQ to SQL no está prepara-do para transformar esta consulta, queusa las nuevas propiedades, en sentenciasSQL. El problema es que en este caso lanueva propiedad f.Actors se está usan-do dentro de la cláusula from. No obs-tante, pudiera hacerse la consulta comose muestra en el código del listado 18.

ConclusionesLa intención de este trabajo ha sido pre-sentar al lector estas clases de entidad,para que pueda comprobar la transpa-rencia en la utilización de las mismas,que le permitirá ganar en claridad y sen-cillez en sus consultas.

El equipo de desarrollo de LINQ toSQL ha argumentado que de momentono tuvo tiempo de incluir una soluciónpara expresar de modo transparente lasrelaciones muchos a muchos, porqueademás por lo general estas relacionesvienen acompañadas de columnas adi-cionales, que se conocen en la literatu-ra sobre el tema como carga adicional(payload). Ciertamente éste es el caso denuestro ejemplo; note que la tabla Fil-mActor incluye una columna adicionalOscarWinner, que indica si el actor ganóun Oscar por su actuación en el film.

La implementación que hemos esbo-zado en este trabajo para expresar lasrelaciones muchos a muchos no preten-de por supuesto ser una solución defini-tiva, sino solo ilustrarle al lector cómopuede incursionar de una manera efec-tiva en el código de mapeo de un modono invasivo, usando los conceptos de cla-ses y métodos parciales.

Listado 16. Usando las propiedades personalizadas Actors en Film y Films en Actor.

Listado 17. Usando las propiedades personalizadas Actors en Film y Films en Actor.

// Excepción en ejecución: LINQ to SQL no puede traducir esto a sentencias SQLvar authorFilms = from f in cineDB.Films

from a in f.Actorswhere a.Name == f.Director.Nameselect new { f.Title, f.Director };

Console.WriteLine(“Films en los que actúa el director\n”);foreach (var f in authorFilms)Console.WriteLine(“ {0} Actuado y dirigido por {1}”, f.Title, f.Director.Name);

Listado 18. Consulta equivalente a la del listado 17.

Console.WriteLine(“Films en los que actúa el director\n”);foreach (var f in cineDB.Films)foreach (var a in f.Actors)if (a.Name == f.Director.Name) {Console.WriteLine(“ {0} Actuado y dirigido por {1}”, f.Title, a.Name);break;

}

Salida:

Films en los que actúa el director

Unforgiven Actuado y dirigido por Clint EastwoodDancing with Wolves Actuado y dirigido por Kevin CostnerMadison Bridges Actuado y dirigido por Clint Eastwood

ReferenciasHernández, Octavio, C# 3.0 y LINQ, Krasis Press, 2007.

Hernández, Octavio, serie de artículos sobre LINQ, dotNetManía nº 25, 26, 29, 32, 36, 2006-2007.

Katrib, Miguel, del Valle, M, Paneque L., Fresneda R., Fuentes T., Hernández Y., Som G., Visual Studio 2008.Desafía todos los retos, Cuaderno Técnico No 8, dotNetManía, 2008.

Marguerie Fabrice, Eichert S., Wooley J., LINQ in Action, Manning Publications 2007.

[1]

[2]

[3]

[4]

var clintFilms = from f in cineDB.Filmswhere f.Director.Name == “Clint Eastwood”select new { f.Title, f.Actors };

Console.WriteLine(“Films de Clint Eastwood y sus actores”);foreach (var f in clintFilms) {Console.WriteLine(“\n {0}”, f.Title);foreach (var a in f.Actors)Console.WriteLine(“ {0}”, a.Name);

}

var dustinFilms = (from a in cineDB.Actorswhere a.Name == “Dustin Hoffman”select new { a.Films }).Single();

Console.WriteLine(“\nFilms en que trabaja Dustin Hoffman\n”);foreach (var f in dustinFilms.Films) {Console.WriteLine(“ {0}”, f.Title);

}

Page 27: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases
Page 28: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

IntroducciónPor el hecho de que SharePoint es el servidor deMicrosoft dedicado al intercambio de información,es un sistema en el que escribir es una actividad con-tinua para sus usuarios. Por lo tanto, lo mismo queen otros productos de la familia Office, MicrosoftOffice SharePoint Server (MOSS) dispone de unservicio para la comprobación de ortografía. El ser-vicio se utiliza en algunos componentes por defectode MOSS, y está disponible para ser utilizado pordesarrolladores, de forma tal que pueda ser imple-mentado en software personalizado, como WebPartso páginas especializadas.

La funcionalidad de corrección de ortografía estáexpuesta como un servicio Web de SharePoint y per-mite no solamente controlar la ortografía en diferen-tes idiomas, sino que también ofrece sugerencias sobrela mejor forma para corregir las palabras con errores.Como hecho curioso, el servicio no es igual al siste-ma utilizado por los otros productos Office, por serutilizado desde el servidor como servicio online; la con-secuencia más directa es que el servicio de SharePointno es tan avanzado ni presenta las mismas facilidadesque el corrector utilizado por Word o Excel (no tie-ne corrección de gramática, por ejemplo).

MOSS utiliza el corrector de ortografía en dife-rentes sitios. Por ejemplo, en cada Lista en dondehay campos de texto hay un botón “Ortografía” enla barra horizontal de herramientas. Utilizando elbotón se abre una ventana emergente que recorretodos los campos de texto, los compara con su dic-cionario y muestra las palabras que no se encuen-tran, junto con sugerencias para corregir los errores.

La misma ventana permite seleccionar el idiomay dialecto para el corrector, aunque el idioma confi-gurado para MOSS se utiliza por defecto. El correc-tor de ortografía solamente compara palabras con sudiccionario interno, sin permitir corrección de sin-taxis ni de gramática. Tampoco es posible agregarnuevas palabras al diccionario, aunque sí es posiblehacer una lista de palabras que no deben ser exami-nadas por el motor de corrección.

El servicio WebToda la funcionalidad del corrector de ortografíaestá disponible como un servicio Web instalado

Verificación de ortografía utilizando SharePoint Server

sharepoint

Microsoft Office SharePoint Server (MOSS) dispone de un servicio parala comprobación de ortografía. El servicio se utiliza en algunos compo-nentes por defecto de MOSS y está disponible para ser utilizado pordesarrolladores, de tal forma que pueda ser implementado en softwarepersonalizado, como WebParts o páginas especializadas.

Figura 1. Lista con el botón de ortografía y pantalla emergente con correcciones

Gustavo Vélez

Gustavo Vélez esingeniero mecánico yelectrónico, especiali-

zado en el diseño,desarrollo e imple-

mentación de softwa-re (MCSD) basado entecnologías de Micro-

soft, especialmenteSharePoint. Es creador

y webmaster dehttp://www.gavd.net/servers, y trabaja como

senior developer enWinvision

(http://www.winvision.nl)

Page 29: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

29

dnm.sharepoint<<

por defecto en MOSS. El servicioSpellCheck.asmx tiene tres parámetrosde entrada:

• chunksToSpell: un array de cadenascon los textos a ser corregidos.

• declaredLanguage: un entero quedetermina el identificador del lengua-je a utilizar para la corrección. Esteidentificador de lenguaje no es el mis-mo al utilizado por SharePoint parasu uso interno, y sus valores predeter-minados se pueden encontrar en elsitio de Microsoft http://msdn2.micro-soft.com/en-us/library/0h88fahh.

aspx (utilice la columna llamada “Deci-mal value”).

• useLad: un booleano que indica si elcorrector debe detectar el lenguajeutilizado por defecto por MOSS.

A primera vista, la utilización delservicio Web es bastante sencilla: cre-ar una referencia, suministrar las cre-denciales del usuario, configurar losparámetros de entrada y ejecutar el ser-vicio. Desafortunadamente, la imple-mentación tiene dos errores crucialesque impiden su utilización.

En primer lugar, si se utiliza el pará-metro de entrada useLad de forma que elcorrector utilice el lenguaje por defectode SharePoint, el servicio utilizará el iden-tificador de lenguaje de MOSS, no elidentificador utilizado por el corrector.En inglés no hay problema, pues los doscoinciden (1033), pero en español (porejemplo), el servicio intentará utilizar 3082(identificador de lenguaje de MOSS paraespañol) en lugar de 1034 (identificadordel corrector para español). La conse-cuencia de esto es que la corrección nun-ca entrega buenos resultados cuando seusa en cualquier otro idioma que no seainglés. La forma de evitar este problemaes simplemente asignar al parámetro use-Lad el valor false y entregarle al servicioWeb el identificador correcto en el pará-metro declaredLanguage. Desafortuna-damente, esto implica utilizar siempre unidentificador fijo, o crear una tabla deequivalencias entre el identificador deMOSS y el del corrector.

El segundo problema es más grave.Por errores en la codificación interna del

servicio Web, ejecutando de una formanormal nunca se devuelve la lista consugerencias. Para solucionar el problema,es necesario llamar al servicio Web utili-zando los métodos de la clase HttpWebRe-quest del espacio de nombres System.Nety crear la consulta XML y envoltorioSOAP manualmente según se muestra enel listado 1.

En el código, primero se crea unStringBuilder que contendrá la llamadaSOAP al servicio Web, al que se agregadirectamente el envoltorio SOAP. Másadelante, se concatena el código XML dela consulta, almacenado en la variable

MiConsulta. En la consulta se están usan-do dos cadenas de ejemplo para ser con-troladas (“aquí estoi”, “y aquí no estoy”),se declara el lenguaje a ser utilizado (9226,español-Colombia) y se indica que no seuse el lenguaje interno de MOSS. A con-tinuación, la cadena resultante se trans-forma en un objeto XmlDocument parapoder utilizarlo en la llamada al servicio.Entonces el objeto miConsultaWeb, de tipoHttpWebRequest es creado utilizando comoparámetro la URL del servicio Web decorrección de ortografía. Al objeto se leasignan las credenciales por defecto delusuario, y se le asignan el tipo de conte-

public void Validación(){

const string EnvolturaSoap = @”<soap:Envelope xmlns:xsi=’http://www.w3.org/2001/XMLSchema-instance’ xmlns:xsd=’http://www.w3.org/2001/XMLSchema’ xmlns:soap=’http://schemas.xmlsoap.org/soap/envelope/’><soap:Body></soap:Body></soap:Envelope>”;

const string MiConsulta = @”<SpellCheck

xmlns=’http://schemas.microsoft.com/sharepoint/publishing/spelling/’><chunksToSpell><string>aquí estoi</string><string>y aquí no estoy</string>

</chunksToSpell><declaredLanguage>9226</declaredLanguage><useLad>false</useLad>

</SpellCheck>”;const string UrlChequeadorWS =

“http://NombreServidor/_vti_bin/SpellCheck.asmx”;const string AccionSoap =

“http://schemas.microsoft.com/sharepoint/publishing/spelling/SpellCheck”;

StringBuilder miStringBuilder = new StringBuilder(EnvolturaSoap);miStringBuilder.Insert( miStringBuilder.ToString().IndexOf(“</soap:Body>”),

MiConsulta);XmlDocument EnvolturaSoapXml = new XmlDocument();EnvolturaSoapXml.LoadXml(miStringBuilder.ToString());

HttpWebRequest miConsultaWeb = HttpWebRequest)WebRequest.Create(UrlChequeadorWS);miConsultaWeb.UseDefaultCredentials = true;miConsultaWeb.Headers.Add(“SOAPAction”, AccionSoap);miConsultaWeb.ContentType = “text/xml;charset=\”utf-8\””;miConsultaWeb.Accept = “text/xml”;miConsultaWeb.Method = “POST”;

using (Stream miStream = miConsultaWeb.GetRequestStream()){

EnvolturaSoapXml.Save(miStream);}IAsyncResult ResultadoAsincronico = miConsultaWeb.BeginGetResponse(null, null);ResultadoAsincronico.AsyncWaitHandle.WaitOne();string RespuestaSoap = string.Empty;using (WebResponse RespuestaWeb =

miConsultaWeb.EndGetResponse(ResultadoAsincronico))using (StreamReader miStreamReader =

new StreamReader(RespuestaWeb.GetResponseStream())){

RespuestaSoap = miStreamReader.ReadToEnd();}

}

Listado 1. Llamada utilizando HttpWebRequest.

Page 30: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

30

dnm.sharepoint<<

nido, el tipo de método a utilizar y la forma en que seenvía el envoltorio. Al encabezado se le agrega el tipode acción SOAP a realizar (variable AccionSoap). Con-secuentemente, se asocia el envoltorio a la llamada alservicio Web, y utilizando la interfaz IAsyncResult seindica que los resultados se esperan de forma asincró-nica, para no interrumpir el funcionamiento de Share-Point. Finalmente, se hace la llamada al servicio Web,que entrega los resultados a través de un objeto del tipoWebResponse. El formato de la respuesta para el ejemplotiene la forma que se muestra en el listado 2.

En la respuesta SOAP se puede ver cómo el correc-tor ha identificado que la primera cadena (chunkIndex= 0) tiene una palabra desconocida (FlaggedWord – word= estoi), que probablemente tiene un error en su quin-to carácter (offset = 5). La sección de sugerencias indi-ca que para la palabra no identificada hay seis alterna-tivas correctas en el diccionario. La segunda cadena noaparece en la respuesta, lo que indica que ha sido acep-tada por el corrector.

El código es por lo demás bastante sencillo, y pue-de ser utilizado en cualquier tipo de componentespara SharePoint (WebParts, WebControls, páginasWeb, etc.). Lo único que resta es extraer la informa-ción desde la respuesta XML y presentarla en panta-lla de la forma deseada.

Componentes Web por defecto para laverificación de ortografíaNo siempre es necesario utilizar el servicio de correc-ción directamente, como se indicó en la sección ante-rior: también es posible usar la infraestructura ya exis-tente en SharePoint. La implementación por defectoen MOSS del corrector de ortografía se basa en unapágina ASPX y dos archivos de Javascript:• SpellChecker.aspx (C:\Archivos de programa\Archi-

vos Comunes\Microsoft Shared\web server extensions

\12\TEMPLATE\LAYOUTS\SpellChecker.aspx) contienela página Web utilizada para mostrar las palabras conerrores y las sugerencias (mostrada en la figura 1).

• SpellChecker.js (C:\Archivos de programa\Archivoscomunes\Microsoft Shared\web server extensions\12\

TEMPLATE\LAYOUTS\3082\SpellChecker.js) contienetodas las rutinas para llamar al servicio Web, mos-trar y corregir las palabras equivocadas.

• SpellCheckerEntirePage.js (C:\Archivos de progra-ma\Archivos comunes\Microsoft Shared\web server

extensions\12\TEMPLATE\LAYOUTS\3082\SpellChec-

ker.js) funciona como un vínculo entre la páginaASPX y las rutinas de Javascript en SpellChecker.js.

En caso de que el idioma no sea detectado, la pági-na ASPX muestra primero un menú para seleccionarel idioma de corrección.

La página por defecto del corrector de MOSS sepuede iniciar desde cualquier página ASPX. Como unejemplo de su utilización, cree un nuevo archivo con laextensión .aspx (ortografia.aspx por ejemplo) en eldirectorio C:\Archivos de programa\Archivos comu-nes\Microsoft Shared\web server extensions\12\TEM-

PLATE\LAYOUTS. Abra el archivo con cualquier editor detexto ASCII, e incluya una referencia al ensamblado deSharePoint:

<%@ Register Tagprefix=”SharePoint” Namespace=”Microsoft.SharePoint.WebControls” Assembly=”Microsoft.SharePoint, Version=12.0.0.0,

Culture=neutral, PublicKeyToken=71e9bce111e9429c”%>

Luego es necesario inicializar los archivos con losscripts de Java:

<SharePoint:ScriptLink language=”javascript” name=”core.js” runat=”server” />

<SharePoint:ScriptLink language=”javascript” name=”SpellCheckEntirePage.js” runat=”server” />

<?xml version=”1.0” encoding=”utf-8” ?><soap:Envelopexmlns:soap=”http:”//schemas.xmlsoap.org/soap/envelope”xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>

<soap:Body><SpellCheckResponse

xmlns=”http://schemas.microsoft.com/sharepoint/publishing/spelling/”>

<SpellCheckResult><errorCode>Ok</errorCode><detectedLanguage>9226</detectedLanguage><spellingErrors><SpellingErrors><chunkIndex>0</chunkIndex><flaggedWords><FlaggedWord><word>estoi</word><type>UnknownWord</type><offset>5</offset>

</FlaggedWord></flaggedWords>

</SpellingErrors></spellingErrors><spellingSuggestions><SpellingSuggestions><word>estoi</word><sug><string>estoy</string><string>esto</string><string>estío</string><string>estoé</string><string>estoó</string><string>estos</string>

</sug></SpellingSuggestions>

</spellingSuggestions></SpellCheckResult>

</SpellCheckResponse></soap:Body></soap:Envelope>

Listado 2. Respuesta SOAP para el ejemplo.

Page 31: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases
Page 32: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

32

dnm.sharepoint<<

Y un método Javascript propio que llame al méto-do apropiado del corrector de ortografía:

<script language=”javascript” type=”text/javascript”>function ControlarOrtografia(){ SpellCheckEntirePage(‘/_vti_bin/SpellCheck.asmx’,

‘/_layouts/SpellChecker.aspx’);}

</script>

Finalmente, se deben crear los controles necesa-rios para introducir el texto a corregir (en este caso unsolo cuadro de texto, pero pueden ser tantos como seanecesario: el corrector los seguirá uno a uno, mos-trando los posibles errores):

<p>Entre algún texto para corregir aquí: &nbsp;&nbsp;<input type=”text” name=”TextoAComprobar” /> </p>

Y un botón o vínculo para iniciar el corrector:

<a href=”javascript:” onclick=”ComprobarOrtografia();”>Compruebe la ortografía</a>

Llame a la página ASPX desde MOSS utilizandosu URL (http://NombreServidor/_layouts/ortogra-fia.aspx). Al solicitar el vínculo, la pantalla emergentedel corrector aparecerá, mostrando las palabras que nohayan sido bien escritas y las sugerencias para mejorarlas(figura 2).

Utilizando el código indicado, todos los textos encon-trados en la página ASPX serán revisados. Si desea evitarque alguno de los controles sea chequeado, utilice el atri-buto excludeFromSpellCheck en la sintaxis HTML. Porejemplo, para crear un cuadro de texto de servidor queno sea controlado por el corrector, utilice algo similar a:

<asp:TextBox ID=”TxtNoControlado” runat=”server” excludeFromSpellCheck=”true” />

Si es estrictamente indispensable, también es posiblemodificar los archivos SpellChecker.aspx, SpellChec-ker.jso SpellCheckerEntirePage.js, pero esto no es reco-mendable ni aceptado por Microsoft, pues en cualquierfuturo service pack los archivos podrán ser restituidos a suestado original.

Modificacióndel diccionarioMOSS incluye pordefecto diccionariosde corrección paratodos los idiomassoportados, y no esposible modificar-los. Pero sí es posi-ble agregar nuevaspalabras, que noserán detectadascomo errores. Paraello, siga los si -guientes pasos:

• Cree una Libreríade documentosllamada “Spe-lling” en la raíz del Portal.

• Cree localmente un archivo de texto llamado Cus-tom Dictionary.txt.

• Agregue al archivo de texto todas las palabras queno deben ser reconocidas como errores por el correc-tor, a una palabra por línea.

• Suba el archivo a la Librería creada anteriormente.

Solo puede haber un Custom Dictionary por cadacolección de sitios, los nombres de la Lista y del archi-vo de texto tienen que ser los indicados, y la Libreríatiene que estar localizada en la raíz del Portal.

ConclusionesSharePoint 2007 provee por primera vez con un correc-tor de ortografía online. El sistema es expuesto pormedio de un servicio Web, pero la implementaciónpresenta algunos problemas que deben ser solventa-dos para poderlo utilizar programáticamente.

El corrector es un componente por defecto deMicrosoft Office SharePoint Server (MOSS), y no seencuentra en la versión Services (WSS). Aunque el sis-tema es eficiente, cobija todos los idiomas utilizadospor SharePoint y detecta errores de ortografía y dasugerencias sobre cómo corregirlos, no permite modi-ficaciones de los diccionarios ni tiene corrección degramática ni de sintaxis.

La pantalla por defecto del corrector se puede utili-zar en cualquier componente personalizado de Share-Point, como páginas ASPX, con solo un par de líneas decódigo. Finalmente, aunque los diccionarios no se pue-den modificar, sí es posible crear listas de palabras que noson controladas por el corrector.

Figura 2. Página personalizada que utilizael corrector de ortografía por defecto

El atributo excludeFrom -SpellCheck puede ser utili-zado de la misma forma encontroles de cliente (HTMLpuro).[ ]

NOTA

Page 33: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

33

dnm.plataforma.net<<

Así que vamos a ir directamente al grano. EnASP.NET, todos los controles de datos complejospermiten consumir directamente resultados devuel-tos por consultas LINQ. Así, por ejemplo, las reji-llas (GridView), listados (DataList, Repeater) y, cómono, el nuevo control ListView, pueden consumirdirectamente resultados IEnumerable<T> devueltospor estas consultas integradas en el lenguaje. Paraello se utiliza la propiedad DataSource que todos esoscontroles poseen, la cual admite –como es sabido–objetos de clases que implementen las interfacesIListSource, IDataSource y nuestro querido IEnume-rable. Sabiendo esto, el modo más directo y básicode empezar a sacar partido a LINQ desde ASP.NETes escribiendo código como el siguiente, tras haberarrastrado una rejilla sobre la página:

Como vemos, lo que se hace es lanzar una sen-cilla consulta LINQ contra un contexto de datosde LINQ to SQL, creado a partir de una base de

datos de existencias de libros. La consulta devuel-ve una enumeración de objetos anónimos que con-tienen la información que nos interesa visualizar.La enlazamos a la rejilla y automáticamente segeneran las columnas apropiadas para visualizarel resultado. Por supuesto, podemos usar con igualéxito cualquier otra extensión de LINQ, como porejemplo LINQ to XML o LINQ to TFS1 paraenlazar y manejar el tipo de información que nosinterese.

El control LinqDataSourceCon la versión 2.0 de ASP.NET se presentó unnuevo modelo de enlace a datos para aplicacionesWeb basado en controles IDataSource (como Sql-

DataSource y ObjectDataSource) que hemos apren-dido a querer todos los programadores .NET. Alos anteriores se les une ahora un nuevo control

LINQ y desarrollo Web: El control LinqDataSource

plataforma.net

José ManuelAlarcón

es redactor de ddotNet-Manía. Es ingeniero indus-trial y especialista en con-

sultoría de empresa. Haescrito varios libros, y ha

publicado más de tres-cientos artículos sobreinformática e ingeniería

en revistas especializadas.Es MVP de ASP.NET,

MCTS, MCPD, MCT ytutor de campusMVP.

Visite su blog enwww.jasoft.org

A estas alturas de la revista, no voy a ser yo quien le hable de LINQ ytodas sus ventajas. Ya debería estar convencido. Lo que sí intentaré esmostrarle cómo sacarle partido a LINQ en el desarrollo de aplicacio-nes Web y aplicaciones en capas en general.

José Manuel Alarcón

protected void Page_Load(object sender, EventArgs e){

StocksBLL.StockLibrosDataContext dc = new StocksBLL.StockLibrosDataContext();var res = from l in dc.Libros

where l.Autor.Contains(“Octavio”)orderby l.Titulo ascendingselect new { l.Titulo, Ejemplares= l.NumEjemplares, l.Precio };

GridView1.DataSource = res;GridView1.DataBind();

}

1 LINQ to TFS es un proveedor LINQ especializado que permite gestionar información de un repositorio de proyectosde Team Foundation Server. Este proveedor se desarrolla desde cero en el libro "C# 3.0 y LINQ" de OctavioHernández, que se puede adquirir en www.dotnetmania.com.

Page 34: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

34

dnm.plataforma.net<<

de origen de datos preparado para tra-bajar directamente con secuenciasLINQ. De este modo, podemos sacarpartido a LINQ pero al mismo tiem-po aprovecharnos de las ventajas deproductividad que nos proporciona elmodelo de enlace a datos declarativo,como las operaciones CRUD sin códi-go o la obtención automática de pará-metros a partir de diversos orígenes(controles o variables de sesión) pararealizar filtrados.

Al igual que ocurre con los contro-les existentes hasta ahora, el controlLinqDataSource ofrece un asistente quenos permitirá configurar las opcionesmás habituales para realizar consultassencillas. En el primer paso del asistente(figura 1), se nos pide que seleccione-mos el objeto sobre el que se lanzaránlas consultas LINQ. En la mayor par-te de los casos usaremos contextos dedatos de LINQ to SQL, por lo que pordefecto se nos muestran solo las clasesde ese tipo disponibles en el proyecto.No obstante, podríamos usar cualquierotra clase definida por nosotros queexponga secuencias enumerables através de una propiedad.

En el siguiente paso (figura 2), selec-cionamos la propiedad sobre la que tra-bajaremos (una “tabla” según la jergadel control, ya que normalmente seránclases que representan tablas en unabase de datos), que debe devolver untipo enumerable apropiado. En la par-te inferior escogeremos qué campos deesa tabla queremos utilizar. Es conve-niente advertir que, además de las pro-piedades de la clase/entidad que mane-jaremos, se nos ofrecen también pro-piedades que representan a otras enti-

dades relacionadas. Por cada campo quees una clave externa aparece una claserelacionada. En la tabla de movimien-tos de stock de nuestro ejemplo, el cam-po idLibro relaciona la tabla con otraque contiene las definiciones de loslibros (título, autor, etc.), por lo que lapropiedad Libro que vemos casi al finalrepresenta, para cada registro, la infor-mación de su libro correspondiente.Del mismo modo se comportan lasparejas (idTipo, TipoMovimiento) e (idRe-seller, Reseller) de la figura. De estemodo podemos obtener explícitamen-te los datos relacionados con nuestrodato principal y usarlos en las expre-siones de enlace a datos.

Una vez elegidos los campos a obte-ner, podemos usar los botones de laderecha para parametrizar el compor-tamiento del control. El botón “Whe-re” permite definir parámetros para fil-trar la consulta. Se trata de un diálogo(figura 3) casi idéntico al que nos ofre-cen otros controles de origen de datos,en el que podremos especificar las con-diciones de filtrado y obtener sus valo-res a partir de cookies, controles, varia-bles de sesión, etc. El botón “OrderBy” nos permite elegir hasta tres cri-terios de ordenación para nuestrosdatos. Finalmente, el botón “Advan-ced” nos ofrece la posibilidad de habi-litar los borrados, actualizaciones einserciones automáticas de datos. Estebotón sólo estará disponible si marca-mos el asterisco para los datos devuel-tos. Si hacemos una proyección de losdatos (es decir, personalizamos los cam-pos devueltos) no se nos permitirá rea-lizar actualizaciones de datos, sino sololectura.

Una vez configurado, el controlfuncionará como cualquier otro de losde su clase antes mencionados, por loque lo enlazaremos inmediatamente auna rejilla o al nuevo control ListView,aparecido con ASP.NET 3.5, y tendre-mos una manera sencilla de visualizar,editar y actualizar datos.

La principal ventaja aquí reside enque podemos generar nuestra capa denegocio (y datos) directamente con unORM (Object-Relational Mapper) comoes LINQ to SQL, sin escribir código deacceso a datos y pudiendo configurarvalidaciones y otras reglas de negocio enlas entidades generadas por la herra-mienta. Luego esta capa de negocio laenlazamos sin esfuerzo a la interfaz deusuario mediante controles LinqData-Source, y seguramente aumentará muchonuestra productividad.

Agrupamiento de datosOtra de las novedades del control

LinqDataSource frente a sus predeceso-res es la capacidad de generar automá-ticamente agrupamientos de la infor-mación devuelta. Para ello se aprove-cha de la orientación a objetos inhe-rente al trabajo con LINQ, devolvien-do un objeto “clave” del agrupamientoy una colección de objetos de detalle.Para entender esto, volvamos al últimopaso del asistente del origen de datos yfijémonos en la segunda lista desplega-ble de la figura 2, “Group By”. En elladebemos escoger uno de los campos dela entidad/tabla que estamos consul-tando, para poder agrupar los resulta-dos según de su valor. Lo más habitual

Figura 1 Figura 2 Figura 3

Page 35: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

35

dnm.plataforma.net<<

es que ese campo sea una de las enti-dades relacionadas. Por ejemplo, en lafigura 4 hemos elegido la entidad Tipo-Movimiento para agrupar todos los movi-mientos de inventario de libros. La lis-ta de selección de campos de la parteinferior cambia, y en lugar de mostrarlos campos de la tabla nos sirve paraindicar qué objetos obtendremos paratrabajar con la agrupación. Por defec-to se generan siempre dos:

• Key: representa al campo o entidad porel que agrupamos. En nuestro ejemplosería para cada grupo un objeto Tipo-Movimiento, del que “colgarían” losmovimientos de ese tipo que devolvierala consulta. Así podemos acceder a laspropiedades de este objeto de agrupa-ción para mostrarlas en un controlenlazado. Por ejemplo, para mostrar ladescripción del tipo de movimientocomo cabecera de cada grupo podría-mos escribir una expresión del estilo:

<%# Eval(“Key.Descrip”) %>

Si bien en este caso, como le hemosasignado el alias “TipoMovimiento”(ver la tercera columna de la figura),la expresión correcta sería:

<%# Eval(“TipoMovimiento.Descrip”) %>

• La colección it que se muestra ensegundo lugar contiene, para cada gru-po, los objetos/entidades que estáncontenidos en el mismo. En este casopor comodidad le hemos asignado elalias “Movimientos”. De este modo,una vez asignados a un control hijo quese encargará de visualizarlos podremos

usar sus propiedades escribiendo sunombre en una expresión # de enlacea datos.Finalmente, al resultado de la agru-

pación podemos añadirle estadísticasque puedan sernos útiles como medias,máximos y mínimos o, como en la figu-ra, un recuento del número de ele-mentos de cada grupo.

Aunque desde el asistente solo es posi-ble conseguir agrupaciones a partir de unúnico campo, el control soporta tambiénagrupaciones múltiples, que conseguire-mos escribiendo a mano su declaración,como se observa en la figura 5. En estadeclaración estamos agrupando por doscampos a la vez, los cuales además sonentidades. Fíjese como se enlaza el con-trol a un ListView para mostrar sus datos.

Proceso general de trabajo deLinqDataSource

Es importante entender cómo el controlefectúa las diferentes operaciones sobrelos datos para no tener sorpresas u obte-ner errores que luego resulten difíciles dedepurar. En el caso más general, en el quehayamos especificado todas las posibili-dades de obtención de datos, el procesosería:

1.- Se aplican los filtros sobre los datos(“Where”).

2.- Se ordenan (“Sort”).3.- Se agrupan los datos resultantes por

el campo o campos comunes indi-cados. (“Group By”).

4.- Se ordenan los grupos resultantes.5.- Se seleccionan los campos concre-

tos que se van a devolver de la con-sulta (“Select”).

6.- Se ordenan los registros según elorden especificado por el controlenlazado (“AutoSort”).

7.- Se obtienen los datos específicos ala página que se esté mostrando enlistados paginados (“AutoPage”).La importancia de esto reside en saber

que, por ejemplo, si establecemos un aliaspara un campo en el parámetro “Select”,éste no estará disponible para hacer fil-tros (parámetro “Where”) o para orde-nar. Fíjese en las figuras anteriores quepara la propiedad OrderGroupsBy se hanutilizado expresiones del estilo key.Des-crip y no como cabría esperar, TipoMovi-miento.Descrip, basadas en el alias que lehemos dado a la clave de agrupación. Elmotivo es el orden expuesto más arriba.

También como consecuencia delproceso expuesto, es posi-ble que aunque especifi-quemos un orden en losdatos devueltos por la con-sulta LINQ (paso 2 delproceso), éstos al final sepuedan mostrar en otroorden distinto, especifica-do éste por el control enla-zado a datos que usemospara visualizarlos (paso 7).Se puede anular esta auto-ordenación final estable-ciendo la propiedad Auto-

Sort del origen de datos a false.Me gustaría destacar una cuestión

importante sobre el proceso 7 de la lis-ta: al paginar los resultados de la consul-ta LINQ to SQL, el control utiliza losoperadores Skip y Take de LINQ paraobtener los registros necesarios. Estoimplica algo muy importante para noso-tros desde el punto de vista del rendi-miento: sólo se obtendrán desde la basede datos los registros exactos que se nece-sitarán para la página actual. Es decir, sitenemos múltiples páginas de datos yestamos en la página 5, con un tamañode página de 10 elementos, solo se tra-erán de la base de datos los registros del41 al 50. Esto contrasta con otros con-troles como SqlDataSource u ObjectDa-taSource, en los que, salvo que nos“curremos” nosotros esta característica,se traen todos los registros y luego semuestran los apropiados. Un desperdi-

Figura 4

Figura 5

Page 36: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

cio de proceso y de transferencia de infor-mación que nos ahorramos con LINQ.

Uso de consultas personalizadasOtra interesante característica delcontrol LinqDataSource es que aunquequeramos usar consultas mucho máscomplejas que las que nos permite eluso de su asistente, es posible sacarlepartido a todas sus características deenlace a datos. Al igual que pasa conlos controles SqlDataSource y Object-DataSource, la manera de modificar alvuelo las consultas que se ejecutancontra el origen de datos es intercep-tando el evento Selecting del control.Por ejemplo, imaginemos que quere-mos obtener una lista de movimien-tos de stock pero solo de tres tiposque nos interesan. Podríamos escri-bir lo siguiente:

A través de la propiedad Result delargumento e podemos asignar la con-sulta que deseemos como resultado parael origen de datos, lo cual puede ser demucha utilidad en ocasiones.

Gestión de valores por defec-to en actualizacionesEl control ofrece tres colecciones de pará-metros que nos permiten controlar elvalor por defecto de los campos de datoscuando se va a realizar una inserción,actualización o borrado de datos. Se tra-ta de las colecciones declarativas Insert-Parameters, UpdateParameters y Delete-

Parameters. Sin dudas la más utilizada esla primera, que nos permite suministrarlos valores por defecto para las insercio-nes de datos cuando el usuario no hayaintroducido un valor en los camposcorrespondientes:

LinqDataSource vs. ObjectDa-taSource

¿Cuál es mejor? Esta es la típica pregun-ta que todo el mundo mesuele hacer cuando hablode este nuevo control. Ymás sabiendo lo útil queme parece el controlObjectDataSource. Puescomo buen gallego debocontestar lo que es derigor en estos casos:“Depende” ;-).

El control ObjectDa-taSource es estupendoen aplicaciones de carác-ter empresarial, separa-das en capas lógicas. En

el fondo, ambos controles se parecenmucho, pues los dos usan objetos, peroen el caso del ObjectDataSource general-mente debemos trabajar más la capa denegocio y de acceso a datos, creandométodos específicos para todas las ope-raciones CRUD (Creación, Lectura,Actualización y Borrado, las cuatro ope-raciones básicas de datos, en su acrónimoanglosajón), además de definir las clasesque representarán a nuestras entidades.

Con LINQ to SQL podemos aho-rrar mucho trabajo en la creación delmodelo de datos y de negocio, como buenORM que es. Dado que los contextos yentidades son clases parciales, podremosañadir lógica de negocio y validaciones a

los mismos, reutilizándolos en todas par-tes y creando así una buena capa de abs-tracción para trabajar. De hecho, estasclases podemos utilizarlas luego desde unObjectDataSource con tan solo exponer elacceso a las mismas como métodos de una

clase, definiendo las opera-ciones CRUD mencionadascon código LINQ.

Esto añade una capa decomplejidad y trabajo adicio-nales que nos podemos aho-rrar usando directamente elcontrol LinqDataSource, quegenerará las consultas LINQpor nosotros desde la capa decliente. Por supuesto, si que-remos exponer la capa de

negocio usando un servicio Web o WCF,no nos quedará más remedio que recurriral ObjectDataSource.

No hay que olvidarse tampoco de queLINQ to SQL solo sirve para trabajarcon bases de datos de SQL Server, así quesi nuestros datos están en Oracle, MySQLu otro gestor de datos tendremos que irolvidándonos de usarlo. Será un controlmucho más interesante cuando aparez-can Entity Framework y LINQ to Enti-ties, lo que nos permitirá crear accesos adatos orientados a objetos e indepen-dientes del gestor de datos subyacente.

En definitiva: usaremos cada uno deestos controles según nuestra situaciónparticular. Ni más ni menos.

En resumenEn este artículo hemos presentado el

modo de trabajar con LINQ en aplica-ciones Web, analizando el nuevo controlespecífico para esta tarea que se incluyeen ASP.NET 3.5: LinqDataSource.Hemos visto sus propiedades básicas, asícomo algunas otras formas avanzadas deutilizarlo. Finalmente, se ha hecho unabreve comparación con el control estre-lla de origen de datos: ObjectDataSource,viendo que cada uno tiene sus situacio-nes ventajosas frente al otro.

El uso conjunto de LINQ to SQLcon el patrón de controles de origen dedatos de ASP.NET es una combinaciónmuy interesante, que nos puede ahorrarmuchas horas de desarrollo.

<asp:LinqDataSource ID=”LinqDataSource1”runat=”server”ContextTypeName=”StocksBLL.StockLibrosDataContext”onselecting=”LinqDataSource1_Selecting”OrderBy=”Fecha desc”TableName=”Movimientos”><InsertParameters><asp:Parameter Name=”idTipo” DefaultValue=”1” />

</InsertParameters></asp:LinqDataSource>

protected void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)

{//Lista de tipos de movimiento que nos interesanint[] tiposMov = new int[] { 1, 3, 5 };

//Obtenemos solo los movimientos que // pertenezcan a la lista anteriorStocksBLL.StockLibrosDataContext dc =

new StocksBLL.StockLibrosDataContext();var res = from m in dc.Movimientos

where tiposMov.Contains<int>(m.idTipo)select m;

e.Result = res;}

36

<<do

tNet

Man

íadnm.plataforma.net<<

Page 37: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases
Page 38: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dnm.metodologías

El desarrollo de software ha ido evolucionando en losúltimos años como consecuencia de la evolución de lastecnologías existentes en el mercado para el desarro-llo de aplicaciones y las necesidades de negocio de lasempresas. No hace tanto tiempo, un equipo de desa-rrollo de una aplicación software se componía de 2 ó3 desarrolladores liderados por un jefe de proyecto,cada uno de los cuales asumía múltiples roles dentrodel ciclo de vida del desarrollo, y que además se encon-traban localizados geográficamente en una misma zonafísica. Hoy en día, la mayoría de proyectos informáti-cos se han convertido en complejos procesos en losque interactúan un gran número de personas con dife-rentes perfiles y objetivos, con la posibilidad de que seencuentren en diferentes zonas geográficas y muchasde ellas incluso no se conozcan personalmente. Paraque este tipo de proyectos se lleven a cabo con éxito,se requiere una estrecha colaboración y coordinaciónde todos los integrantes del equipo.

Con la aparición de Visual Studio Team Sys-tem 2005 (VSTS 2005), Microsoft intentó por pri-mera vez ofrecer una herramienta orientada al tra-bajo en equipo para todos los participantes en la ges-tión del ciclo de vida de aplicaciones. Hasta esemomento, las anteriores versiones de Visual Studiono habían sido más que un entorno orientado a satis-facer parte de las necesidades del desarrollador desoftware. VSTS 2005 solucionaba muchos de los pro-blemas con los que los integrantes de un proyecto seencontraban durante el ciclo de vida de un desarro-

llo. Visual Studio Team System 2008 (VSTS 2008)es una evolución de la primera versión que aportanuevas y mejores soluciones a problemas que la ver-sión anterior ya resolvía, y también ofrece respues-tas a nuevos requerimientos que no habían sido inclui-dos en la versión anterior.

El principal objetivo de VSTS 2008 es asegurarla consecución del éxito en el desarrollo de aplica-ciones de software, permitiendo:

• Colaborar y comunicarse de manera más eficientecon otros miembros del equipo y personas coninterés directo en la empresa.

• Garantizar la calidad del software mediante herra-mientas de calidad avanzadas en cada paso del ciclode vida de la aplicación.

Visual Studio Team System 2008,trabajo en equipo

metodologías

Carles VallejoTeam leader y project

director de Raona. Carleses MCSD .NET y arqui-tecto de software. [email protected]

Con la reciente presentación de Visual Studio Team System 2008, Microsoftrenueva su apuesta por ofrecer una solución orientada a mejorar la gestióndel ciclo de vida de las aplicaciones (ALM, Application Life-cycle Management).Esta solución se compone de un conjunto de herramientas, procesos y guías,integradas en un solo entorno, para potenciar el trabajo en equipo de los dife-rentes roles que participan en el proceso de desarrollo de software.

Carles Vallejo

Figura 1Componentes de Visual Studio Team System 2008

Page 39: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

39

dnm.metodologías<<

• Ganar mayor visibilidad en la activi-dad del proyecto y establecer priori-dades para tomar decisiones basadasen datos en tiempo real.

VSTS 2008 Architecture EditionLa edición de VS2008 se centra en mejo-rar el diseño y la validación de los siste-mas distribuidos. Ofrece a los arquitectos,los directores de operaciones y los desa-rrolladores la capacidad de crear visual-mente soluciones orientadas a servicios yde validarlas en sus entornos operativosantes de la implementación. Permite ase-gurar el éxito en el modelado y desplie-gue de aplicaciones distribuidas. Las prin-cipales novedades de esta edición son:

• Top-down System DesignAhora es posible realizar un diseño des-cendente de nuestros diagramas de sis-temas, para tener una mejor visión deldiseño de nuestras aplicaciones, crean-do primero una versión de alto nivelcon los componentes necesarios sinreferencia a ninguna tecnología, parair progresivamente refinando nuestrodiseño añadiendo las aplicaciones ypuntos de conexión concretos.

• Conform to WSDLPermite definir o modificar los con-tratos de los puntos de conexión defi-nidos en nuestros diagramas como ser-vicios Web, obligando al desarrolla-dor a implementar el contrato especi-ficado en el diseño de la aplicación.

• Web Application ProjectsAl añadir una aplicación Web ennuestro diseño de aplicaciones, esposible generar la estructura de códi-go para el proyecto Web en nuestrasolución. También es posible reali-zar ingeniería inversa con solucionesque contengan proyectos Web al aña-dir un diagrama de aplicaciones.

• Architectural RolesPermite decorar los componentes denuestros diagramas para especificar laresponsabilidad o rol de éstos dentrodel diseño. Es posible utilizar patro-

nes de diseño predefinidos paraespecificar funciones concretas delos diferentes componentes de laarquitectura.

• Custom PrototypesEn esta nueva edición es posiblepersonalizar los diferentes com-ponentes de nuestros diagramas(aplicaciones, servidores, puntosde conexión, zonas, etc.) y reutili-zarlos directamente desde la barra deherramientas.

VSTS 2008 Development EditionLa edición de VS2008 para desarrolla-dores ofrece un conjunto de herramien-tas avanzadas para identificar código pocoeficaz, no seguro o de baja calidad, espe-cificar las prácticas recomendadas decodificación y automatizar las pruebasunitarias de software. Estas herramien-tas ayudan a los miembros de los equi-pos a escribir código de mejor calidad,reducir los problemas relacionados conla seguridad y evitar errores posterioresen el ciclo de vida del desarrollo. Lasprincipales novedades de esta edición son:

• Code MetricsEsta utilidad permite evaluar la com-plejidad de nuestro código a través decinco métricas de calidad que evalúandesde las líneas de código de nuestrosproyectos hasta el acoplamiento yprofundidad de la jerarquía de nues-tras clases y el número de puntos dedecisión dentro de una función.Además, estas cinco reglas pueden serincluidas como políticas de check-in,con lo que podemos detectar si secumplen las métricas de calidad en elmomento de subir código al servidor.

• JavascriptOtra novedad significativa es la mejo-ra del entorno para depurar códigoJavascript, desde la posibilidad de aña-dir puntos de ruptura en el códigoJavascript en páginas ASP.NET, has-ta la de depurar fácilmente los docu-mentos de Javascript incrustados en

nuestras páginas por los controles deservidor y la mejora del soporte parala inspección de variables.

• Profiler ToolsCon VS2005 se incorporó la posibili-dad de hacer análisis de rendimientode nuestras aplicaciones para poderestudiar los puntos en los que había laposibilidad de mejorar el rendimien-to de nuestro código. Ahora VS2008incorpora la posibilidad de comparardos ejecuciones diferentes de nuestrasaplicaciones, para comprobar en laspruebas de regresión el resultado delas mejoras incorporadas en el códigopara aumentar el rendimiento.Además, los informes de rendimientode VS2008 incorporan la posibilidadde detectar automáticamente, a travésde los llamados hotpaths, los puntos crí-

ticos de una aplicación, sin tener querealizar una búsqueda manual dentrodel árbol de llamadas a funciones.Por último, se ofrece soporte com-pleto para aplicaciones de 64-bits,

Figura 2. Resultado del análisis de métricas de código de una aplicación

Figura 3. Comparación de análisis derendimiento de una aplicación.

Page 40: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

40

dnm.metodologías<<

contadores de Windows y aplicacio-nes que incluyen servicios WCF.

• Spelling rulesUna de las novedades en VS2005 fuela posibilidad de realizar análisis está-tico de código. Estos análisis per-mitían, a través de la definición deuna serie de reglas, detectar posibleserrores, deficiencias o violaciones deconvenios en nuestro código sinnecesidad de compilarlo. VS2008incorpora un conjunto de nuevasreglas que nos permiten detectarerrores en los identificadores de nues-tro código, con la posibilidad de aña-dir nuestros propios diccionarios depalabras reconocibles.

VSTS 2008 Database EditionLa edición de VS2008 para desarrolla-dores de bases de datos ofrece herra-mientas avanzadas para la administra-ción y pruebas de cambios en las basesde datos, así como funcionalidades parapermitir a los desarrolladores y los admi-nistradores de bases de datos ser másproductivos e incrementar la calidad delas aplicaciones en el nivel de la base dedatos. Las principales novedades de estaedición son:

• Integrated SetupEsta edición se ha integrado en la ins-talación de Visual Studio 2008 TeamSuite, cosa que no ocurría en la ver-sión 2005, ya que su aparición fue pos-terior al resto de ediciones.

• Table and Index OptionsAdemás de incluir las funcionalida-des incorporadas en la Service Rele-ase 1 para esta edición, incorpora laposibilidad de especificar diferentesopciones en la definición de tablas eíndices.

VSTS 2008 Test EditionLa edición de VS2008 para los respon-sables de testear las aplicaciones ofreceun conjunto completo de herramientas

de prueba para aplicaciones y serviciosWeb integradas en el entorno de VisualStudio. Estas herramientas de pruebapermiten a los responsables de pruebascrear, ejecutar y administrar las pruebasy elementos de trabajo relacionados des-de el entorno de Visual Studio. Las prin-cipales novedades de esta edición son:

• Control Load ModelingEn las pruebas de carga, puede especi-ficarse la distribución de las pruebas indi-viduales mediante el número de prue-bas por hora para cada usuario. Hasta elmomento, la duración de las pruebas decarga solo podía especificarse a través deun tiempo fijo; ahora también puedeespecificarse mediante un número deejecuciones de las pruebas.

• New default viewsLa ejecución de una prueba de cargapermite visualizar simultáneamente has-ta 4 gráficas con resultados de diferen-tes contadores y compararlos en el mis-mo intervalo de tiempo y escala. Losresultados de las pruebas de carga pue-den exportarse a formato Excel o CSV.

• Devices Unit testingSe incorpora la posibilidad de crear yejecutar pruebas unitarias para dispo-sitivos móviles, tanto para emulado-res como dispositivos físicos.

• Test Performance ImprovementsSe ha reescrito el motor de ejecuciónde pruebas para mejorar su rendimientoy reducir la sobrecarga de las ejecucio-nes de las pruebas, aumentando así elratio de pruebas por segundo que se

ejecutan. Es posible crear relaciones deherencia entre clases de pruebas, y seha añadido la opción de ir directamen-te a la línea de código que ha produci-do el error de una prueba.

• Right-Click Test ExecutionOtra de las novedades añadidas es laposibilidad de ejecutar las pruebasunitarias asociadas al contexto actualdonde nos encontramos, como unmétodo, clase o proyecto.

• Test Generation from a CompiledAssemblyTambién se pueden generar pruebasunitarias sobre ensamblados compila-dos en C#, Visual Basic .NET y Mana-ged C++, sin necesidad de disponer delcódigo fuente de dichos ensamblados.

• Webtest Recorder Support forAJAX and PopupsLas pruebas Web dan soporte al regis-tro de peticiones AJAX y elementosemergentes de Javascript.

• Support for initialization and termi-nation tests per virtual userSe ha incorporado la posibili-dad de indicar las pruebas a eje-cutar en la inicialización y fina-lización de cada sesión de unusuario virtual.

• Web Test CorrelationLas pruebas Web son capacesde detectar los parámetros devalor dinámico y enlazar el

valor de estos parámetros entrediferentes peticiones de la sesión.

• UI Web Test ImprovementsSe han añadido mejoras en la visuali-zación de los resultados de las prue-bas Web para simplificar el análisis delas peticiones, la navegación entrediferentes peticiones y la lectura delos parámetros de una petición.

Team Foundation Server 2008Microsoft Visual Studio 2008 TeamFoundation Server (TFS 2008) es el

Figura 4. Vista de ejecución de una prueba de carga

Page 41: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

41

dnm.metodologías<<

servidor de colaboración en el centrodel sistema, que permite a todos loscomponentes del equipo trabajar deforma más eficiente y ofrecer softwarede mejor calidad. Combina la admi-nistración de proyectos, el seguimien-to de elementos de trabajo, el controlde código fuente, la administración deversiones, la generación de informes yla orientación de procesos en un servi-dor de equipo unificado. TFS 2008ofrece integración con Microsoft Offi-ce System (Microsoft Excel y Micro-soft Project), lo que proporciona elacceso a analistas de negocios y jefesde proyectos mediante aplicacionesconocidas. Además, TFS 2008 incluyeun acceso Web para gestionar estasfuncionalidades y los recursos del pro-yecto. Las principales novedades deeste servidor son:

• MOSS 2007/Window Server 2008/SQL Server 2008 supportTFS 2008 ofrece soporte para el des-pliegue en servidores Windows Ser-ver 2008, SQL Server 2008 y MOSS2007.

• Team BuildsLas compilaciones programadassoportan integración continua, sien-do posible definir las acciones que ini-ciarán una compilación. También esposible planificar las compilacionesautomáticas cada cierto tiempo.Desde VS2008 es posible detener yeliminar compilaciones automáticas.Es posible hacer uso de comunicaciónSSL entre el servidor TFS y el servi-dor de compilaciones.

• Source ControlAhora es posible eliminar permanente-mente el contenido borrado del controlde código fuente. Se ha incorporado laposibilidad de obtener la última versiónde un fichero en el momento de des-protegerlo. El servidor TFS Proxy dasoporte para extranets, pudiendo espe-cificar diferentes credenciales para elacceso a él y al servidor TFS. Se hanintroducido mejoras en la operación demezcla de ficheros y en el refresco de lainterfaz del control de código.También se han incorporado dos utili-dades de las Power Tools: Annotate,que permite visualizar los cambios enun fichero y cuándo y quién los ha rea-lizado, y Folder Diff, que permite rea-lizar una comparación entre dos carpe-tas del servidor, dos carpetas locales ouna carpeta del servidor y otra carpetalocal para identificar las diferencias.

• Work Item TrackingEl rendimiento en las operaciones degestión de tareas se ha mejorado,reduciéndose la carga de estas opera-ciones a la mitad en comparación conTFS 2005. También se ha incorpora-do la posibilidad de eliminar WorkItems en el servidor y se han realiza-do mejoras en la usabilidad de las con-sultas de tareas.

• Team System Web AccessSe ha incorporado un acceso Web parala gestión de TFS, que permite a losusuarios que no utilizan Visual Studiorealizar gestión de tareas, errores, revi-sión de compilaciones automáticas yacceso al contenido del Source Con-trol desde cualquier máquina.

• Migración y compatibilidadCabe destacar la completa compati-bilidad entre VSTS 2005 y VSTS

2008. Esta compatibilidad nos per-mite trabajar contra un servidor TFS2008 con los componentes clientede la versión 2005 y viceversa, acce-der a servidores TFS 2005 con loscomponentes cliente de la versión2008.

En resumenVisual Studio Team System 2008supone un paso adelante por parte deMicrosoft para ofrecer a la comunidadde desarrolladores de software un entor-no integrado que da respuestas a susnecesidades durante el ciclo de vida delas aplicaciones. Team System permiteaumentar las posibilidades de éxito deun proyecto mediante un conjunto deherramientas avanzadas y especializadasque permiten aumentar la productivi-dad y la colaboración de los integrantesde un equipo de desarrollo. Pero estaversión no es el final del camino, ya queMicrosoft ya está preparando una nue-va versión de Team System, con nom-bre en código Rosario, con el objetivode promover avances aún mayores en eldesarrollo de aplicaciones de calidad,ofreciendo nuevas soluciones para todoel ciclo de vida del desarrollo de aplica-ciones de software.

Figura 5. Soporte para integración continuaen las compilaciones automáticas

Figura 6. Interfaz de Team System Web Access

Enlaceshttp://msdn2.microsoft.com/en-us/library/bb385832.aspx

http://msdn2.microsoft.com/en-us/vsts2008/products/default.aspx

http://geeks.ms/blogs/ilanda/archive/2007/12/04/visual-studio-team-system-2008.aspx

http://www.microsoft.com/spain/expression/expression-studio/default.mspx

[1]

[2]

[3]

[4]

Page 42: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Las consultas integradas en Visual Basic9.0LINQ es la gran novedad de las nuevas versiones delos lenguajes de .NET Framework 3.5, y Visual Basicno es una excepción. Al igual que ocurre con C#, sehan incorporado en el propio lenguaje las instruc-ciones necesarias para hacer que LINQ se pueda uti-lizar de forma casi natural desde Visual Basic. Estoes así porque esa “naturalidad” se la proporcionanlas instrucciones que nos permiten realizar las con-sultas integradas como si cualquier otra tarea deVisual Basic quisiéramos realizar.

Gracias a esta integración de las consultas en ellenguaje, podemos escribir códigos como el del lis-

tado 1, en el que accedemos a una tabla de una basede datos de SQL Server usando las instrucciones pro-pias del compilador.

Como vemos en el código del listado 1, se utili-zan instrucciones propias del lenguaje para hacer lamisma tarea que las instrucciones equivalentes en ellenguaje de consulta estructurado (SQL) al que segu-ramente ya estaremos habituados cuando creamosuna consulta de selección usando T-SQL (el lenguajede consulta usado en SQL Server).

La variable que recibe la consulta (res) contienecada uno de los datos que coinciden con el filtro reali-zado (Where) y en el orden indicado después de OrderBy. Los datos individuales que contiene el resultado dela consulta son los que indicamos justo después de lacláusula Select. En este ejemplo, la colección genera-da como resultado de la consulta es del tipo IEnumera-ble(Of String), ya que el tipo de datos que contendráel resultado de la consulta será una colección con cadauno de los elementos indicados por Select, y en estecaso en particular ese valor es una “simple” cadena.

Isla VB

Guillermo “Guille”Som

Es Microsoft MVP deVisual Basic desde 1997.Es redactor de ddotNet-Manía, mentor de Solid

Quality Mentors, oradorde Ineta Latam, y autor

de los libros “ManualImprescindible de Visual

Basic .NET” y “VisualBasic 2005” y “Noveda-

des de Visual Basic 9.0” ypróximamente “Apren-da C# 3.0 desde 0.0 –

Parte 3: Lo nuevo” .http://www.elguille.info.

No vamos a entrar en la discusión de cómo traducir el título de este artí-culo, aunque éste sería más fácil que el original “To be or not to be”, ya quecasi nadie se pone de acuerdo sobre si es “ser o no ser” o “existir o no exis-tir”. Lo que es seguro es que en las consultas integradas de Visual Basic 9.0,la cláusula Select existe, pero no tiene por estar (o ser).

Guillermo «Guille» Som

To Select or not to Select...Ésa es la cuestión sobre las consultas de LINQ

Guillermo Som ingresará los derechos de autor deeste artículo en la cuenta de Ayuda a Juanma a vivir.Desde aquí, invita a los lectores de esta isla solida-ria para que hagan sus aportaciones o participen enlas subastas que se realizan desde la Web de Juan-ma para recaudar fondos con el fin de ayudar en lainvestigación de una cura para la enfermedad deAlexander. http://www.ayudajuanma.es.

Isla solidaria Dim res = From emp In db.Employees _Where emp.Country = "UK" _Order By emp.LastName _Select emp.TitleOfCourtesy & " " & _

emp.LastName & ", " & _emp.FirstName & ", " & _emp.Country

Listado 1. Las consultas integradas nos permiten usarinstrucciones de VB para acceder a los datos

Page 43: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

43

dnm.isla.vb<<

Y tal como se indica en el título deeste artículo, el resultado de las consultasintegradas en Visual Basic 9.0 puede cam-biar mucho según lo que indiquemos enla cláusula Select. Y en esa cláusula es enla que nos vamos a centrar en este artí-culo sobre las consultas LINQ que pode-mos crear con Visual Basic.

Los diferentes sabores deSelect en Visual BasicEn Visual Basic, el uso de la cláusulaSelect es opcional. Si no se indica, escomo si se indicara el mismo objeto quese utiliza para acceder a los datos. Enel ejemplo del listado 1, equivaldría aindicar el objeto completo de la tablaEmployee (en ese código sería usar lavariable emp).

Si indicamos la cláusula Select,podemos afinar mucho más el conte-nido del resultado de la consulta. En elcódigo del listado 1, he preferido hacer-lo como una cadena de caracteres conlos diferentes datos a mostrar, por lasencilla razón de que el resultado deesa consulta lo he querido mostrar enun control ListBox y he usado el códi-go del listado 2 para añadir todos loselementos.

Si a un control del tipo ListControl(que es el tipo base de los controlesListBox y ComboBox) añadimos elemen-tos de un tipo determinado, lo quehacen estos controles es mostrar el valordevuelto por la propiedad ToString decada elemento o, como es este caso,mostrar la cadena que se ha asignado acada uno de los elementos. Por tanto,el haber optado por utilizar una conca-tenación de los campos a mostrar comoresultado de cada elemento de la con-sulta, simplemente ha sido por conve-niencia.

Pero la forma de añadir todos esoselementos a la colección Items del con-

trol ha sido posible gracias a las exten-siones proporcionadas por .NET Fra-mework 3.5, en particular al métodoextensor ToArray que la nueva versiónde .NET Framework define para lascolecciones generic del tipo IEnumera-ble(Of T).

Pero dejemos estas extensiones yvolvamos a la cláusula Select. En estacláusula siempre indicaremos el datoque queremos que contenga la colec-ción generada por la consulta, y depen-diendo de qué queramos obtener, así loindicaremos. Por ejemplo, si quisiéra-mos crear un tipo que contenga de for-ma independiente cada una de las pro-piedades que en el ejemplo del listado1 hemos unido para formar una cade-na, tendríamos que escribir algo pare-cido al código del listado 3.

En el código del listado 3, cadaelemento del resultado de la consul-ta es un tipo anónimo que tiene comopropiedades los campos indicados dela tabla Employees, es decir, tendría-mos un tipo anónimo (creado sobrela marcha) con cuatro propiedades:TitleOfCourtesy, FirstName, LastNamey Country. El problema de este tipoanónimo (problema para lo que yoquiero hacer, que es añadir los ele-mentos a un control ListBox y que semuestren de forma “amigable”), esque al igual que el resto de tipos anó-nimos, el método ToString se generaautomáticamente y no hay forma deque podamos crear nuestra propiaimplementación. Por tanto, al mos-trarse esos valores en el ListBox, lohará al estilo del texto mostrado en ellistado 4, es decir, los tipos anónimos

siempre definen un método ToStringque se obtiene mediante la concate-nación del formato “Nombre propie-dad = valor” para cada una de las pro-piedades, separando cada par propie-dad/valor con una coma y encerran-do todo el contenido entre llaves. Ysinceramente, este no es el formatoque me gustaría ver en cada elemen-to de un ListBox.

La ventaja de usar un tipo anónimode estas características es que si quere-mos acceder a cada una de las propie-dades de forma independiente, pode-mos hacerlo fácilmente y de forma,digamos, natural. Por ejemplo, en el lis-tado 5 añadimos al control ListBox soloel valor de dos de las propiedades deltipo anónimo generado por el resulta-do de la consulta.

El problema es que si yo quisieramostrar todos los datos que ya mos-tré en el listado 1, tendría que añadiresa información al ListBox concate-nando los valores de cada propiedaddel tipo anónimo, y por supuestohaciendo un bucle que recorra cadauno de los elementos generados en lavariable que contiene la consulta; portanto, me tendría que olvidar de usarel método AddRange de la colecciónItems para añadir todos los elementosde una sola vez.

ListBox1.Items.AddRange(res.ToArray)

Listado 2. Añadir todos los elementos de laconsulta a un control ListBox

Dim res1 = From emp In db.Employees _Where emp.Country = "UK" _Order By emp.LastName _Select emp.TitleOfCourtesy, _

emp.FirstName, _emp.LastName, _emp.Country

Listado 3. Selección de los camposindividuales a incluir en los elementos de laconsulta

{ TitleOfCourtesy = Mr., FirstName = Steven, LastName = Buchanan,

Country = UK }

Listado 4. El método ToString de los tiposanónimos siempre tiene este formato

For Each d In res1 ListBox1.Items.Add( _

d.TitleOfCourtesy & " " & _d.LastName)

Next

Listado 5. Podemos acceder a cadapropiedad del tipo anónimo de forma

independiente

Page 44: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

44

Una solución para solventar este problema queme estoy imponiendo sería aprovecharse de la gene-ración automática de clases para acceder a las tablasde la base de datos. En nuestro caso particular, tene-mos una clase llamada Employee que es la que repre-senta a cada uno de los elementos de la tabla Emplo-yees. Y debido a que esa clase está definida directa-mente en nuestro proyecto, podemos crear nuestrapropia versión del método ToString y definirlo paraque devuelva los datos que yo quiero que se mues-tren en el ListBox. Esto lo podríamos hacer tal comovemos en el listado 6, y para crear esa consulta y asig-nar los valores al ListBox, lo podremos hacer tal comovemos en el listado 7.

En la consulta del listado 7, la cláusula Select esopcional, ya que utilizamos como elemento indivi-dual el indicado para recorrer cada uno de los regis-tros de la tabla (la variable de rango); por tanto, elcompilador se encargará de crear una colección deltipo IEnumerable(Of Employee) como resultado de estaconsulta.

La ventaja de usar esta última consulta es que cadaelemento de la colección Items del ListBox contieneun objeto del tipo Employee y debido a que hemos rede-finido el método ToString para esa clase, se mostra-rán los datos como queríamos (o como yo quería),pero con la ventaja de que en cualquier momentopodemos acceder a cada uno de los objetos Employee

que hemos asignado a esa colección. Por ejemplo, enel listado 10, que es el código del método que inter-cepta el evento SelectedIndexChanged del ListBox,podemos acceder a cada objeto de ese tipo haciendola conversión correspondiente, ya que el tipo de datosinterno de la colección Items del control ListBox esde tipo Object.

La cláusula Select permite crear tipos anónimosde distintas maneras. En el listado 3 hemos usadouna forma abreviada de creación de tipos anónimosque “canónicamente” deberíamos haber hecho talcomo vemos en el listado 11, y es que Visual Basicnos facilita la creación de nuevos elementos (anóni-

dnm.isla.vb<<

Partial Public Class EmployeePublic Overrides Function ToString() As String

Return TitleOfCourtesy & " " & _LastName & ", " & FirstName & ", " & _Country

End FunctionEnd Class

Listado 6. Redefinición del método ToString para mostrar losdatos que queremos

Dim res2 = From emp In db.Employees _Where emp.Country = "UK" _Order By emp.LastName _Select emp

ListBox1.Items.AddRange(res2.ToArray)

Listado 7. Indicar con la cláusula Select la variable de rango es opcional

Private Sub ListBox1_SelectedIndexChanged( _ByVal sender As Object, _ByVal e As EventArgs) _Handles ListBox1.SelectedIndexChanged

Dim emp = TryCast(ListBox1.SelectedItem, Employee)

If emp IsNot Nothing ThenClipboard.SetText(emp.LastName)

End If

End Sub

Listado 10. Interceptar la selección de un elemento delListBox y convertirlo al tipo adecuado

El resultado de las consultas integradas en Visual Basic 9.0 puede

cambiar mucho según lo que indiquemos en la cláusula Select

Page 45: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

45

dnm.isla.vb<<

Los nombres de las variables de las clases mapeadas por O/R Designer

Es posible que la clase generada por el diseñadorde objetos relacionales (O/R Designer) se llameEmployees en lugar de Employee, al menos a mí meha ocurrido que en la versión en inglés de VisualStudio 2008 se crea una clase en singular, sinembargo en la versión en castellano (desde unWindows XP), se genera en plural. Si ése es elcaso, sustituir la definición de la clase parcialEmployee por Employees (esa sustitución de nom-bres no hay que hacerla en el código de acceso ala tabla en la consulta de LINQ, ya que cada tablase “mapea” usando el mismo nombre de la tablade la base de datos).

En cualquier caso, el nombre de la clase gene-rada la podemos modificar desde las propiedadesdel diseñador. Para ello, seleccionamos la tablaarrastrada al diseñador y lo modificamos tal comovemos en la figura 1.

Y si queremos controlar cómo se usarán losnombres de las clases generadas, siempre lo pode-mos hacer desde la línea de comandos por mediode la utilidad SQLMetal.exe, ya que si indicamos

la opción /pluralize se generarán los nombresen singular y si no indicamos esa opción los nom-bres de las clases se generan en plural. Para gene-rar la clase de entidad de la tabla Employees de labase de datos Northwind (que en mi caso está enla instancia SQLEXPRESS de SQL Server), podemosusar el código de los listados 8 y 9 si queremosque se generen en plural (listado 8) o en singu-lar (listado 9).

sqlmetal /server:(local)\SQLEXPRESS /database:Northwind /code:"Northwind (sin pluralize).vb"

Listado 8. Generar la clase con los nombres en plural

sqlmetal /server:(local)\SQLEXPRESS /database:Northwind /code:"Northwind (con pluralize).vb" /pluralize

Listado 9. Generar la clase con los nombres en singular

En la documentación de Visual Studio 2008 seindica una nota sobre los nombres de las tablasde Northwind al utilizarse esta utilidad para gene-rar las clases de entidad.También se indica que la opción /pluralize soloestá disponible para la versión en inglés de Esta-dos Unidos, pero en todas las instalaciones en lasque he probado (tres en total, dos de ellas conel Visual Studio en castellano) ha funcionado comoindico en los ejemplos anteriores.En cualquier caso, es conveniente saber que lapluralización se realiza siguiendo las normas delidioma inglés.

[ ]NOTA

mos) sin necesidad de crearlos de forma explícita; portanto, el código del listado 11 (adaptándolo a la sin-taxis adecuada) sería el que también tendríamos queusar en C#.

Sin embargo, en el listado 7 no creamos ningúntipo anónimo, ya que estamos usando un objeto deltipo Employee, que puede ser cualquier cosa, exceptoanónimo.

Otra forma de usar la cláusula Select en VisualBasic sería para indicar como elemento individual dela colección generada como resultado de la consultael valor devuelto por un método. En ese caso, ten-dríamos que engañar un poco al compilador, ya queel compilador de Visual Basic no permite (aunque síel compilador de C#) que el miembro indicado en lacláusula Select sea el nombre de un método de la cla-

Figura 1. Desde el diseñador de objetos relacionalespodemos cambiar el nombre de las clases generadas

Page 46: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

46

dnm.isla.vb<<

se Object. Si lo hiciéramos, como en elcaso del listado 12, recibiríamos unerror de compilación (ver la figura 2)en el que nos indicaría: “El nombre deuna variable de rango no puede coin-cidir con el nombre de un miembro dela clase ‘Object’.”. Aunque cualquierotro método sí podríamos usarlo, almenos si ese método no está definidoen el tipo “elemental” de .NET Fra-mework.

Para finalizar este repaso a la cláu-sula Select de las consultas LINQ des-de Visual Basic, comentar otra formade indicar las propiedades del tipo anó-nimo que se creará como elemento parala colección generada.

Como ya vimos en el listado 3, elcompilador usará de forma automá-tica los nombres de las propiedadesque indiquemos de la tabla/clase usa-da como variable de rango, pero si

queremos usar otros nombres dife-rentes a los que el compilador deVisual Basic usará, debemos indicar-lo bien creando un tipo anónimo

(según el estilo que vimos en el lista-do 11), o bien haciéndolo comovemos en el listado 13; de esta forma,las propiedades del tipo anónimo usa-do tendrán los nombres que nosotroshayamos elegido.

Esto mismo podríamos hacerlo parasolventar el problema de que VisualBasic no nos deja usar los métodos dela clase Object. Por tanto, el código(erróneo) del listado 12 lo podríamos

escribir tal como vemos en el listado14; en ese código asignamos el valordevuelto por el método a una variable,y el compilador usará como tipo dedatos de la colección devuelta el tipode datos del valor devuelto por el méto-do, en este caso, un valor de tipo String,pero no creará un tipo anónimo conuna propiedad llamada Dato. Si esa fue-ra nuestra intención, tendríamos quehacerlo tal como se muestra en el códi-go del listado 15.

ConclusionesEn este artículo sobre las consultas inte-gradas de LINQ en Visual Basic me hecentrado en la cláusula Select. Sé quetendría que haberme enrollado menossobre una de esas nuevas instruccionesde consulta y haber comentado mássobre el resto de instrucciones que seincluyen en Visual Basic, pero la ideaes intentar dejar claras las cuestiones,y espero haberlo conseguido. Del res-to de instrucciones que el lenguajeincluye ya nos iremos ocupando enotros artículos de esta nuestra isla deVisual Basic en dotNetManía, aunqueno será el próximo mes, ya que para elmes de junio tengo preparado otrotema que continúa al publicado el mespasado, y en el que también veremosalgo de LINQ, pero referente a LINQto XML.

Dim res3 = From emp In db.Employees _Where emp.Country = "UK" _Order By emp.LastName _Select New With _

{ _.TitleOfCourtesy = emp.TitleOfCourtesy, _.FirstName = emp.FirstName, _.Lastame = emp.LastName, _.Country = emp.Country _

}

Listado 11. Visual Basic nos facilita la creación de tipos anónimos en la cláusula Select

Dim res4 = From emp In db.Employees _Where emp.Country = "UK" _Select emp.ToString

Listado 12. Los métodos de Object no sepueden usar como variables de rango

Dim res5 = _From emp In db.Employees _Where emp.Country = "UK" _Order By emp.LastName _Select Título = emp.TitleOfCourtesy, _

Nombre = emp.FirstName, _Apellidos = emp.LastName, _País = emp.Country

Listado 13. Podemos personalizar losnombres de las propiedades del tipoanónimo generado como elemento de lacolección

Dim res6 = From emp In db.Employees _Where emp.Country = "UK" _Select Dato = emp.ToString

Listado 14. Los métodos de Object sí lospodemos usar si los asignamos a una variable

Dim res7 = From emp In db.Employees _Where emp.Country = "UK" _Select New With _

{.Dato = emp.ToString}

Listado 15. El código del listado no crea untipo anónimo, éste sí

Figura 2. Error al usar un método de Object como variable de rango en la cláusula Select

Page 47: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases
Page 48: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Bueno, lo primero es que la Beta 1 de Silverlight2.0 no ofrece realmente todo el poder de WPFen la Web. Silverlight 2.0 soporta un “subcon-junto compatible” de la capacidad total del WPFde .NET Framework 3.x. En este contexto, un“subconjunto compatible” indica que no hay carac-terísticas significativas de WPF que falten en Sil-verlight, pero no hay compatibilidad absoluta enla sintaxis. Esto quiere decir, por ejemplo, quealgunos elementos de XAML no están soporta-dos (por ejemplo, Label, GroupBox) y otros estánsoportados con un menor conjunto de opciones.Por ejemplo, el elemento {Binding} no soporta elatributo Source, y se debe recurrir a establecer lapropiedad DataContext en un subárbol de XAMLpara definir una fuente compartida para los enla-ces dependientes. Binding, Input, Controls y Layoutsí están soportados, aunque sea en una versión más“ligera”. Al menos, como hemos dicho, en estaBeta 1.

Al momento de escribir esto, no está clarocuáles son los planes de Microsoft para el futu-

ro, en el sentido de avanzar hacia una total com-patibilidad, o de seguir perfeccionando ese “sub-conjunto compatible”. Dicho esto, no haysoporte para 3D, ni se espera que se añada pos-teriormente.

¿Digo esto por coherencia y gusto por la pre-cisión? No. Lo digo, sobre todo, para dejar claraslas diferencias que existen entre Silverlight 2.0como front end, y las soluciones Web basadas enWPF, como XBAP.

XBAP es un tipo particular de aplicación WPFque se empaqueta y distribuye vía Web, de formaque recuerda el típico comportamiento de unnavegador. XBAP te permite ejecutar una aplica-ción completa en el cliente, pero con una expe-riencia de usuario similar a la de una página Web.Internamente, XBAP utiliza ClickOnce para dis-tribuir la aplicación WPF al cliente. El ficheroXBAP es del tipo de manifiesto de ClickOnce,normalmente con extensión .application. Estefichero origina la ejecución del proceso host deInternet Explorer como una aplicación WPF basa-

Aplicación vs.Aplicación

Dino Esposito

Dino Espositoes ponente habitualen eventos a nivelmundial y redactor

de revistas comoMSDN Magazine ydotNetManía. Visite

su blog en:http://weblogs.

asp.net/despos. (todotNet.QA@

dotnetmania.com)

Ahora que Silverlight 2.0 ofrece toda la potencia de WPF en la Web sin restricciones de plata-forma, ¿cuál es el futuro de XBAP y las aplicaciones ClickOnce? ¿Se terminarán para siempre?¿Debería de dejar de considerarlas como una alternativa para aplicaciones smart client? ¿Y cuáles la posición oficial de Microsoft?

todonet@qa

¿Cuántas veces ha estado tentado de preguntar cuál es la diferencia entre el produc-to A y el producto B y cuándo usar uno u otro? Conocer en detalle las tecnologíasque utilizamos es una opción prudente y sabia. A través de estas preguntas, le ayuda-remos a discernirlo, abarcando varios escenarios.

tod

otN

et.q

a@

dot

netm

ania

.com

Page 49: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Ya que mencionas Web Client Softwa-re Factory (WCSF), asumo que estás másinteresado en una discusión enfocada ala Web. Sin embargo, MVP, MVC y lasfactorías de software son “agnósticas” enlo tocante al software y son mecanismosindependientes de la plataforma. MVC,también conocido como Modelo-Vista-Controlador, es un viejo patrón de inter-faz de usuario que sugiere la división dela aplicación en tres componentes: elmodelo, la vista y el controlador. Elmodelo representa los datos con los quese trabaja. La vista, lo que se debería mos-trar al usuario final. El controlador es elcódigo que decide la vista que se ha demostrar, en base al estado del modelo (y quizá otros pará-metros). No sé si recordará esto, pero antes de la llega-da de .NET las librerías MFC (Microsoft FoundationClasses) eran muy populares, y suministraban una exce-lente implementación de este patrón. Es importantereseñar que, en este patrón, ambos, Vista y Controlador,tienen acceso al Modelo.

Al objeto de racionalizar el esquema, este patrónevolucionó de tal forma que el controlador fuera elúnico componente de ese trío responsable –al mismotiempo– de la navegación y de actualizar la Vista. Deforma que se concibió un nuevo elemento (el con-trolador de la aplicación, muchas veces sobrecarga-do) que manejaba la navegación. Como resultado, elcontrolador se convirtió en presentador, y de ahí elcambio de nombre.

Así pues, el patrón MVP es una evolución del patrónMVC original donde sólo el presentador tiene acceso almodelo, y se comunica con la vista a través de una inter-faz contractual (figura 1). El presentador no sabe nadaacerca de la implementación real de la vista; todo lo que“sabe” es cómo pasar los datos a la vista y cómo leerlosde la vista. El mismo presentador puede ser perfecta-mente un formulario Windows o una página Web.

En el mundo Web está tomando últimamente cier-ta importancia una derivación del patrón MVC lla-mado por algunos WebMVC, o simplemente, MVC.Para evitar confusiones, utilizaré el primer término.Hay una diferencia fundamental entre MVP yWebMVC, además de las indicadas anteriormente.En WebMVC, cualquier acción del usuario originauna petición HTTP que va al controlador. Los pará-

da en páginas. Como resultado, se ejecuta en una zonade confianza restringida, dependiendo de su lugar deubicación (que es la ruta de XBAP). Cualquier limi-tación impuesta por la zona de confianza parcial esaplicable en este caso, incluyendo la imposibilidad deacceso a ficheros locales –a excepción de los guarda-dos mediante almacenamiento aislado– y tampoco sepermite llamar a otras URL que no sean del sitio deorigen.

¿Seguirá siendo útil XBAP cuando salga Silverlight2.0? La única ventaja clara que posee sobre Silverlight2.0 es su capacidad 3D y el acceso completo a contro-

les, estilos o temas, cosas que son propias de WPF en.NET Framework 3.x. Por otro lado, una aplicaciónXBAP requiere .NET Framework 3.x en el cliente, yestá limitada a la plataforma Windows.

En suma, creo que XBAP permanecerá como unaopción en el futuro previsible, pero su importancia yutilidad se reducirá debido a la naturaleza interope-rable de Silverlight. Una aplicación Silverlight es unaaplicación Web completa; una aplicación XBAP esuna aplicación smart client que se ejecuta en el nave-gador en un entorno de confianza restringida. Esa esla diferencia principal.

dotN

etM

anía

<<

49

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

dnm.todonet@qa<<

Los patrones MVP y MVC me parecen lo mismo, aunque supongo que estoy pasando por alto algunadiferencia sutil. Pero, más allá de las diferencias, ¿cuál es el valor añadido por utilizar una u otra arqui-tectura? ¿Se relacionan estos patrones por casualidad con las factorías de software? ¿O con la WebClient Software Factory que está disponible en Microsoft Patterns & Practices?

El patrón MVP es una evolución del patrón MVC original donde sólo el presentador tiene acceso

al modelo

Page 50: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

En general, en cualquier escenario donde la lógica mane-jada por el flujo de trabajo está contenida en una aplica-ción, WF es una mejor elección. Estos escenarios inclu-yen ciertamente lógica de negocio de larga duración, abs-tracción de las reglas respecto a la lógica, y controlado-res de páginas de interfaz de usuario. Cuando se requie-re una interacción de baja latencia y de tipo síncronoentre la aplicación y el flujo de trabajo, difícilmente podre-mos decir que BizTalk 2006 sea lo ideal, sobre todo porrazones de rendimiento.

Las orquestaciones de BizTalk Server 2006 se ejecu-tan normalmente en un servidor dedicado y su invocaciónpor parte del cliente requiere un viaje de ida y vuelta.Además, BizTalk Server 2006 almacena cada mensaje segúnaspectos de duración del proceso, y esto introduce unalatencia adicional. Esa latencia es difícil de justificar en unainterfaz de usuario interactiva, cuando el flujo de trabajoopera de forma síncrona. En este tipo especial de flujos detrabajo, es preferible WF debido a que es más sencillo ymás barato que BizTalk Server 2006.

dotN

etM

anía

<<

50

dnm.todonet@qa<<T

odot

Net.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

Traducido al castellano por Marino Posadas

metros de entrada son básicamente incrustados en la peti-ción. El controlador deduce qué es lo que hay que hacer,interactúa con el modelo y produce datos para la vista.La vista es meramente un procedimiento de visualiza-ción (rendering). Vea la figura 2.

Este así llamado patrón WebMVC está ganando adep-tos en la actualidad gracias a marcos de desarrollo comoStruts, Rails y ASP.NET MVC Framework.

No hay valor añadido en la utilización de estos mode-los simplemente porque estén de moda. El único valor realen ambos modelos es que permiten manejar mejor la com-plejidad. No están ahí para hacer el código más simple (omás elegante). Existen para permitir que el código muycomplejo resulte más fácil de escribir, manejar y mantener.Para sitios sencillos, el modelo code-behind de ASP.NET esperfecto, y, si se quiere separación de objetivos entre la inter-

faz de usuario y las responsabilidades de lógica de negocio,no hay nada que lo impida en ASP.NET.

Finalmente, WSCF es una factoría de softwareespecíficamente diseñada para ayudar en aplicacionesASP.NET complejas o sofisticadas. No es más que unacolección de recursos, que incluyen elementos prefa-bricados de la aplicación con contenedores que per-miten la personalización del código, guías y patronesde arquitectura, código reutilizable, diseñadores y, enel mejor de los casos, una implementación de refe-rencia o una aplicación realista. Típicamente, basán-dose en esa factoría de software un arquitecto perso-naliza una colección de recursos y distribuye el paque-te al equipo de desarrollo. Los desarrolladores pue-den entonces centrarse en los aspectos clave del nego-cio y ahorrar tiempo y costes. La factoría de softwareWSCF está basada en el patrón MVP para la interfazde usuario de la aplicación Web resultante.

Creo necesitar algo de guía para elegir entre BizTalk Server 2006 y Windows Workflow Foundation. Miaplicación es un escenario de flujo de trabajo en el que una tarea de larga duración debe implementarsecomo workflow1. Creo que lo mejor sería usar Windows Workflow Foundation, pero me resulta difícil jus-tificarlo ante el responsable. ¿Qué puedo aducir al respecto?

Figura 2

Figura 1

1 Entendemos por workflow la implementación real en código del flujo de trabajo.

Page 51: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases
Page 52: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

Desde hace ya varios años, personalidades muy desta-cadas del mundo del desarrollo de software (como HerbSutter, arquitecto de software en el equipo de VisualC++ y secretario del comité de estandarización ISO deC++, véase [1]) han venido advirtiéndonos sobre cómolas posibilidades de los fabricantes de procesadores deaumentar el rendimiento mediante métodos más tra-dicionales estaban alcanzando sus límites naturales ytodos estaban moviéndose simultáneamente haciaarquitecturas basadas en múltiples núcleos, razones porlas que la explotación por parte del software de la con-currencia y su hermano menor, el paralelismo, se con-vertiría en muy poco tiempo en un elemento funda-mental de cara a obtener un rendimiento superior denuestras aplicaciones.

Como bien conoce el lector, ese momento ya hallegado: la mayoría de los equipos que utilizamoshoy dispone de dos o más núcleos. Microsoft ha reco-nocido este hecho, y en consecuencia ha desarrolla-do la Iniciativa para la computación paralela (Para-

llel Computing Initiative [2]), una serie de esfuer-zos destinados a incorporar, en todos los niveles dela pila de soluciones que la empresa ofrece (ver figu-ra 1), los elementos de software que faciliten la explo-tación de las posibilidades que ofrecen los ordena-dores con múltiples núcleos.

Es en este marco en el que se ofreció a la comu-nidad, en diciembre de 2007, la primera versión pre-liminar de un producto denominado por el momen-to Parallel Extensions to .NET Framework 3.5,que incluye (unificadas en un único ensamblado,cuyo nombre actual es System.Threading.dll) doslibrerías que (con los lógicos cambios que su expe-riencia de utilización promueva) formarán parte enun futuro no muy lejano de la plataforma de desa-rrollo y ejecución de aplicaciones .NET: la Libreríade tareas paralelas (Task Parallel Library, TPL [3])y LINQ paralelo (Parallel LINQ, PLINQ [4]). A

Task Parallel Library (TPL) y Parallel LINQ (PLINQ)

Laboratorio.netOctavio Hernández

Después de varias ediciones consecutivas presentando productos comerciales,este mes describiremos (en el marco del ejemplar dedicado a LINQ) las posibi-lidades que abrirá ante los desarrolladores la futura incorporación a .NET denuevas librerías de código manejado orientadas a obtener un mayor aprovecha-miento de los múltiples núcleos que componen (cada vez más frecuentemente)los ordenadores con los que trabajamos.

Nombre: Parallel Extensions to .NETFramework 3.5Versión: CTP de diciembre de 2007Fabricante: MicrosoftDescarga:http://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180baCategoría: Librerías para .NET 3.5

Ficha técnica

Figura 1

Octavio Hernández esMentoring TeamLeader de Plain

Concepts, editortécnico de

dotNetManía y tutorde campusMVP.

Es MVP de C# desde2004, MCSD y MCT.

Page 53: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

53

dnm.laboratorio.net<<

continuación describiremos brevemente qué es cadauna de ellas.

Task Parallel Library (TPL)La Librería de tareas paralelas (espacios de nombresSystem.Threading y System.Threading.Tasks) es unalibrería de código manejado que contiene clases tan-to de alto como de bajo nivel que facilitan la explota-ción del paralelismo. Entre los recursos de alto nivel,como cabría esperar, se incluyen clases como Task,ReplicableTask o Future, que permiten representar losprincipales conceptos de la programación concurren-te y expresar los mecanismos tradicionales de planifi-cación y sincronización de tareas. Por otra parte, losrecursos más básicos se concentran alrededor de una cla-se estática, llamada convenientemente Parallel, que ofre-ce métodos para expresar construcciones de más bajonivel, como bucles for y foreach paralelos. Por ejemplo,el listado 1 (extraído de un ejemplo de la CTP) muestrados fragmentos de código que implementan el algorit-mo clásico de multiplicación de matrices, en un caso uti-lizando los recursos tradicionales del lenguaje, y en elsegundo llamando al método Parallel.For, que utilizarávarios hilos de trabajo paralelos, en función de la canti-dad de procesadores disponible y de la configuración dela aplicación. El código asume la existencia de una claseMatrix<T>.

En mi máquina, que dispone de un procesador dedoble núcleo, el tiempo de ejecución del algoritmo alutilizar el bucle paralelo se reduce casi a la mitad, comocabría esperar en este sencillo caso de paralelismo norestringido.

Parallel LINQ (PLINQ)El segundo componente de esta CTP es LINQ parale-lo (PLINQ), que no es más que un proveedor LINQbasado en la librería anterior y capaz, por tanto, de eje-cutar las consultas integradas aprovechando toda la poten-cia que ofrezcan los núcleos o procesadores disponiblesen el equipo. La arquitectura y desarrollo de proveedo-res LINQ se describe detalladamente en [5].

Básicamente, esta librería agrega al espacio denombres System.Linq una nueva interfaz genérica,IParallelEnumerable<T>, que hereda de IEnumera-ble<T>. Al mismo tiempo, define una clase estática,ParallelEnumerable, que contiene (como es tradicio-nal, mediante métodos extensores) las implementa-ciones de los operadores de consulta estándar paraaquellas secuencias que implementen IParallelEnu-merable<T>. Por último, otra clase estática llamadaParallelQuery ofrece varias sobrecargas del método

extensor AsParallel(), que extiende IEnumerable<T>y permite transformar un IEnumerable<T> en IPara-llelEnumerable<T>. Gracias a esta arquitectura, elmodelo de programación de consultas integradas siguesiendo prácticamente el mismo, y lo único que senecesita para hacer que una consulta de LINQ toObjects o LINQ to XML utilice los operadores “para-lelos” en lugar de los “normales” es aplicarle al ori-gen de la consulta el operador AsParallel(), o indi-car explícitamente (sobre todo en el caso de que seutilice la sintaxis de llamadas) que se desea utilizar unmétodo de ParallelEnumerable.

Como ejemplo, el fragmento de programa que sepresenta en el listado 2 implementa, mediante unaconsulta integrada, el cálculo aproximado del núme-ro PI utilizando la fórmula de Leibniz (figura 2).

public static Matrix<double> MultiplySequential(Matrix<double> m1, Matrix<double> m2)

{Matrix<double> result = new Matrix<double>(m1.Rows,

m2.Columns);for (int i = 0; i < m1.Rows; i++){

for (int j = 0; j < m2.Columns; j++){

result[i, j] = 0;for (int k = 0; k < m1.Columns; k++){

result[i, j] += m1[i, k] * m2[k, j];}

}}return result;

}

public static Matrix<double> MultiplyParallel(Matrix<double> m1, Matrix<double> m2)

{Matrix<double> result = new Matrix<double>(m1.Rows,

m2.Columns);Parallel.For(0, m1.Rows, i =>{

for (int j = 0; j < m2.Columns; j++){

result[i, j] = 0;for (int k = 0; k < m1.Columns; k++){

result[i, j] += m1[i, k] * m2[k, j];}

}});return result;

}

Listado 1. Dos variantes de multiplicación de matrices.

Page 54: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

54

dnm.laboratorio.net<<

La ganancia en el rendimiento que se obtiene alutilizar la implementación paralela de los operadoresde consulta para este ejemplo es, en mi ordenador dedoble núcleo, de alrededor de un 40%.

ConclusionesTPL y PLINQ conforman, en su conjunto, la primeraola de software de Microsoft surgido como parte de su

Iniciativa para la computación paralela y preparado, portanto, para facilitar a los desarrolladores la explotaciónde las posibilidades de concurrencia inherentes a lasmáquinas con múltiples procesadores. Es de esperar que,sobre esta base, en un futuro no muy lejano comiencena aparecer nuevos recursos para esta misma finalidad enlos diferentes niveles de la pila mostrada en la figura 1(¡tal vez, incluso, hasta en los lenguajes de programa-ción!). Recomendamos a los lectores no perder de vis-ta el desarrollo de esta interesante vertiente.

Figura 2. La fórmula de Leibniz

static long Time(Action action){

Stopwatch sw = Stopwatch.StartNew();action();return sw.ElapsedMilliseconds;

}

private void calcPi(int iterations){

// cambiar Enumerable por ParallelEnumerable para PLINQdouble pi = 4 * System.Linq.Enumerable.Range(0, iterations).

Select(n => (n % 2 == 0 ? 1.0 : -1.0) / (2 * n + 1)).Sum();

// MessageBox.Show(pi.ToString());}

private void button2_Click(object sender, EventArgs e){

long time = Time(() => calcPi(100000000));MessageBox.Show("Tiempo transcurrido: " + time.ToString());

}

Listado 2. Cálculo de PI mediante una consulta integrada y la fórmula de Leibniz.

ReferenciasSutter, H. “The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software”, enhttp://www.gotw.ca/publications/concurrency-ddj.htm.

“The Manycore Shift White Paper”, enhttp://www.microsoft.com/downloads/details.aspx?familyid=633F9F08-AAD9-46C4-8CAE-B204472838E1.

Leijen, D., Hall, J. “Optimize Managed Code For Multi-Core Machines”, en MSDN Magazine, octubre de 2007.

Duffy, J., Essey, E. “Running Queries On Multi-Core Processors”, en MSDN Magazine, octubre de 2007.

Hernández, O. “C# 3.0 y LINQ”, Krasis Press, octubre de 2007.

[1]

[2]

[3]

[4]

[5]

Page 55: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

55

dnm.metodologías

Las certificaciones de los distintos fabricantes tratan defacilitar a los usuarios de sus tecnologías una forma dedemostrar que están capacitados para trabajar con ellas.Tienden a ser muy valoradas en las empresas, ya queel hecho de haberse certificado suele implicar al menosunos conocimientos mínimos y un interés de mejoraprofesional, algo que por desgracia no es tan fácil deencontrar en el mercado laboral hoy en día. Existenestudios realizados en empresas de diversos tamañosque muestran cómo las que tienen un alto porcentajede personal certificado en sus filas son más producti-vas y obtienen mayores niveles de satisfacción de clien-tes (más información en http://www.microsoft.com/learning/mcp/benefits/whyhire.mspx). De hecho, enalgunas empresas estar certificado en tu área de espe-cialidad es una condición indispensable para acceder aun puesto de trabajo. Si eres un profesional técnico,obtener una certificación es tal vez la mejor manera dedemostrar de modo objetivo tu preparación y tener másposibilidad de mejorar laboralmente.

Microsoft hace muchos años que dispone de planescompletos de certificación en sus diferentes tecnologías.Éstos se han ido adaptando poco a poco a los tiempos,tratando de mejorar su utilidad de cara a lo que acabode comentar, esto es, idoneidad para realizar un traba-

jo. En este artículo vamos a hablar sobre las certifica-ciones para desarrolladores, y cómo se van a ver afecta-das por la aparición de Visual Studio 2008 y toda la plé-tora de tecnologías asociadas a esta herramienta.

Evolución de las certificacionesAntiguamente, con las certificaciones MCAD y MCSEpara Visual Studio 2003 se perseguía que los alumnosdemostrasen ciertos conocimientos técnicos específi-cos, pero sin estar ligados realmente a ningún rol detrabajo o casuística de desarrollo. Esta forma de certi-ficar presentaba varios problemas a medida que la tec-nología iba avanzando y las empresas cambiaban denecesidades.

La primera limitación era que para obtener una cer-tificación se estudiaba absolutamente de todo: desa-rrollo para escritorio, aplicaciones Web, comunicacio-nes entre capas, etc. Lo cual está bien, pues debes sabermuchas cosas, pero el refranero popular se aplica tam-bién a esto y “el que mucho abarca, poco aprieta”. Esdecir, se aprendían muchas cosas diferentes, peromuchas de ellas de una forma superficial y orientadasolo al aspecto más técnico. En los exámenes opciona-les se podía escoger casi de todo (Biztalk Server, SQLServer, IIS, Commerce Server, aplicaciones seguras,etc.) y había que elegir solo uno. La eclosión de tec-nologías que se ha producido en los últimos años haceque un desarrollador tenga necesariamente que espe-cializarse, pues hay demasiadas cosas como para domi-narlas todas a fondo y además mantenerse al día.

Por otro lado, estas certificaciones dejaban un pocode lado la vida real de un desarrollador: los problemasde índole práctica que se encuentra uno todos los díasy que no se aprenden a resolver en los libros o en uncurso, sino a partir de la experiencia y el sentido común.Esto muchas veces demuestra más que unos merosconocimientos técnicos concretos, que siempre son másfáciles de obtener que un bagaje propio, o como se sue-le decir, que “tener muchas tablas”.

Por este motivo, con la aparición de Visual Studio2005, Microsoft decidió cambiar el modelo de certifi-

Las nuevas certificacionespara desarrolladores

formación

José ManuelAlarcón

es redactor de ddotNet-Manía. Es ingeniero

industrial y especialista enconsultoría de empresa.

Ha escrito varios libros, yha publicado más detrescientos artículos

sobre informática e inge-niería en revistas especia-

lizadas. Es MVP deASP.NET, MCTS, MCPD,

MCT y tutor de campusMVP.

Visite su blog enwww.jasoft.org

Hace poco tiempo que tenemosentre nosotros la versión definiti-va de Visual Studio 2008. Micro-soft está trabajando en los nuevosexámenes de certificación, queirán apareciendo paulatinamentedesde finales de marzo hasta elverano. Vamos a analizar qué cam-bios e implicaciones tienen éstospara los que desean certificarse.

José Manuel Alarcón

Page 56: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

56

dnm.formación<<

cación, implantando uno más ordenado yen sintonía con las verdaderas necesida-des de desarrolladores y empresas. Endicho modelo, un programador se puedecertificar en ciertas tecnologías con unamayor especialización, y además ampliarsus horizontes de certificación de formaascendente o lateral, como se ilustra en lafigura 1.

Existen pues tres certificaciones“núcleo” (con el número 1 en la figura),que son primordialmente técnicas yevalúan los conocimientos de quien se exa-mina sobre un área de desarrollo concre-ta: aplicaciones de escritorio, aplicacionesWeb o aplicaciones distribuidas. Son nece-sarios dos exámenes para obtener el cer-tificado y tienen el apropiado nombre de“Microsoft Certified Technology Specia-list” (MCTS) o “especialista en tecno-logía”. Con esto demostramos un buenconocimiento de todo lo necesario paradesarrollar con garantías, por ejemplo,aplicaciones Web, o la especialidad quedeseemos entre las tres disponibles.

Podemos ir más allá, para lo cual exis-te un título superior llamado “MicrosoftCertified Professional Developer”(MCPD). Para obtenerlo, solo es necesa-rio un examen. En éste se evalúan no tan-to conocimientos técnicos como capaci-dades de índole práctica y de resoluciónde problemas, obtenidas de la experienciaen situaciones y problemas comunes. UnMCPD se orienta también a alguna de las

especialidades anteriores, y de hecho esnecesario tener uno de los tres MCTS paraoptar a ser MCPD. Así, por ejemplo, enel examen para obtener el MCPD en desa-rrollo Web, las preguntas tienen que vercon situaciones reales a resolver sobre esca-labilidad, configuración, arquitectura deaplicaciones, etc. Es decir, que las preguntas“van más allá” de una buena base técnica.

Éste es el motivo de que el MCPD seamuy valorado en las empresas.

Dado que existen muchas otras tec-nologías relacionadas con el desarrolloademás de estas tres especialidades,podemos ampliar nuestros horizonteslateralmente, certificándonos en tecno-logías concretas que puedan comple-mentar nuestro trabajo. Para ello seofrecen también algunas especializacio-nes técnicas individuales, a las que seopta con un solo examen, y que sirvenpara demostrar conocimientos en tec-nologías específicas que se usan comobase para el desarrollo. Así, nos pode-mos especializar en administración ymantenimiento de SQL Server o endesarrollo para dispositivos móviles conWindows Mobile, por ejemplo. Son uncomplemento perfecto para las certifi-caciones principales que acabo de des-cribir, y junto con éstas ofrecen unamanera de orientarnos profesional-mente demostrando nuestros conoci-mientos, y permitiendo a su vez un con-trol más granular sobre el proceso.

El mítico examen 70-536

Las tres certificaciones MCTS “núcleo”que acabamos de ver, aún siendo muy dife-rentes, necesitan de unos conocimientostécnicos mínimos que son necesarios inde-pendientemente de si programamos parala Web, para Windows o componentessin interfaz de usuario. Éstos abarcan con-ceptos que van desde los tipos básicos olas colecciones hasta la programación mul-ti-hilo y la seguridad de la plataforma,pasando por globalización, reflexión,diagnóstico, configuración y multitud decuestiones más que un buen desarrolla-dor .NET debería conocer.

Conscientes de esto, en Microsoftdesarrollaron un examen específico defundamentos de la plataforma, conocidocomo 70-536: Application Develop-ment Foundation. Este examen es unode los dos que es necesario aprobar paraobtener cualquiera de las tres certifica-ciones MCTS de tipo “núcleo”. Así, unavez aprobado el 70-536, solo necesitare-mos hacer un examen más para obtenercualquiera de las tres especialidades dedesarrollo con Visual Studio 2005 (Web,Windows o Aplicaciones distribuidas), locual lo convierte en un candidato idealpara preparar en primer lugar.

Enseguida veremos qué cambia en lascertificaciones con Visual Studio 2008,pero muchos estarán encantados de saberque el examen 70-536 sigue siendo labase de todas ellas. Esto implica que siahora apruebas el 70-536 podrás certifi-carte tanto con VS2005 como conVS2008. Y también que si ya eres ahoraMCTS o MCPD en VS2005, te ahorrarásun examen cuando quieras obtener las nue-vas certificaciones. Se trata de algo lógico,pues al fin y al cabo los fundamentos de laplataforma siguen siendo los mismos, y dehecho .NET 3.0 no es más que .NET 2.0con algunas bibliotecas adicionales. .NET3.5 añade algunas características a los len-guajes, la mayoría de las cuales (por nodecir todas) están encaminadas al trabajocon las consultas integradas en el lengua-je (LINQ), que ya tienen su propio exa-men, como veremos enseguida.

Por cierto, una breve nota de interés:el examen 70-536 es el único examen decertificación que, al hacerlo, no te con-

Figura1

Page 57: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

57

dnm.formación<<

vierte en Microsoft Certified Professional(MCP); es decir, no te certifica en modoalguno. Es solo la base para convertirse enMCTS, pero no otorga por sí mismo títu-lo ni reconocimiento, aunque al aprobar-lo sí tendrás acceso al sitio privado de losMCP. Si apuestas por la certificación,tendrás que aprobar al menos otro examenmás para tener un título oficial.

Las certificaciones de VisualStudio 2008Con Visual Studio 2008 y .NET 3.5,Microsoft ha decidido mantener el mis-mo modelo de certificaciones que puedesver en la figura 1 y que hemos estadocomentando. Por ello, se mantienen lasmismas posibilidades y denominacionesde certificados (MCTS y MCPD), soloque ahora en lugar de tres especialidadeshabrá el doble: seis. ¿Tantas? Pues sí. Eranecesario y personalmente me parece unadecisión muy acertada por parte de Micro-soft, dada la cantidad de nuevas tecno-logías disponibles alrededor de .NET, cadauna de ellas lo suficientemente extensa yespecializada como para merecer un cer-tificado independiente.

Así, las nuevas certificaciones te per-mitirán especializarte en:

• Desarrollo Windows Forms (70-505)• Desarrollo Web con ASP.NET (70-

562).• Desarrollo con Windows Communi-

cation Foundation (70-503)• Acceso a datos con ADO.NET (70-

561).• Desarrollo con Windows Workflow

Foundation (70-504).• Interfaces avanzadas con Windows Pre-

sentation Foundation (70-502).

He incluido entre paréntesis el núme-ro de examen que es necesario aprobarjunto con el 70-536 para convertirse enMCTS en cada disciplina concreta.

Las dos primeras certificaciones de lalista son muy parecidas a las actuales paraVS2005, si bien abarcan todas las nuevascaracterísticas que introduce .NET 3.5 encada especialidad. La tercera, relacionadacon WCF, es similar a la anteriormente dis-ponible para certificarse en creación de apli-

caciones distribuidas, pero está basado enla nueva tecnología de comunicaciones(Windows Communication Foundation)en lugar de en Servicios Web, WS-*, .NETRemoting, etc., por lo que requerirá bas-tante preparación por parte de los que yacontrolaran esas tecnologías anteriores.

Me parece un especial acierto el haberintroducido una certificación específicapara el acceso a datos. En las certificacio-nes de VS2005 este tema se toca somera-mente en los exámenes de especialización.Siendo una carencia muy habitual en losprogramadores, me parece interesante queahora podamos demostrar específica-mente nuestro dominio de esa materia tanimportante. Las empresas también loagradecerán. En este examen entran tam-bién LINQ y el nuevo Entity Framework,sobre los que llevan unos meses escri-biendo en esta revista Octavio Hernán-dez y Unai Zorrilla, si bien aún estará enfase beta cuando el examen aparezca.

Finalmente, las dos últimas especiali-dades están orientadas a dos tecnologíasnuevas y muy específicas, de las que has-ta ahora no teníamos posibilidad de cer-tificarnos en modo alguno, ni siquieracomo parte de otra más amplia.

¿Qué pasa entonces con lascertificaciones actuales?La respuesta es muy sencilla: no pasa nada.Seguirán siendo válidas durante toda la

vida si las consigues ahora, y los exáme-nes seguirán estando disponibles al mis-mo tiempo que los de VS2008 durantevarios años. Por eso, si has empezado acertificarte, no deberías preocuparte.Además, las empresas seguirán usandoVS2005 durante mucho tiempo, y por lotanto estas especializaciones seguirán sien-do muy demandadas.

Si actualmente tienes una certificaciónde VS2005 o estás a punto de conseguir-la, podrás pasarte a las certificaciones nue-vas de tu especialidad en VS2008 con unsolo examen. En el caso de ser un MCTS,bastará con el examen correspondienteindicado en la sección anterior. En el casode que seas MCPD, también habrá unexamen de actualización, si bien Micro-soft no ha dado datos de disponibilidad delos mismos por el momento.

En este punto es muy importanteseñalar que, por el contrario, no habráforma de actualizarse a las nuevas

certificaciones desde MCAD oMCSE, es decir, desde las certifica-ciones antiguas de VS2003. Por esemotivo, es muy interesante que si estásen esa situación te actualices a MCPDde VS2005 cuanto antes. En la figura2 se pueden ver las diferentes rutas aseguir para actualizarse. El cambio teimplicará en el caso más habitual unsolo examen, mientras que si quieressaltar a VS2008 tendrás que partir decero y hacer al menos tres.

Figura 2

Page 58: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases

dotN

etM

anía

<<

58

desvánLibros e información en Internet

Comentaba Umberto Eco que, básicamente, podemos dividir loslibros en dos categorías: aquellos que fueron pensados para ser leídosy los que se han concebido como obras de consulta. El primer tipo,citando los comentarios del boloñés, “se lee del tirón y ahí termina laexperiencia lectora”. El segundo se conserva, se reutiliza, se desgastacon el tiempo y envejece con su propietario, habiéndole servido bien,como un esclavo de papel siempre disponible, y siempre dispuesto arecordar a su amo las cosas que el desuso o la memoria han llevadohasta en el desván de las ideas perdidas.

No obstante, el papel que juegan estos últimos está siendo ame-nazado: es mucho más fácil consultar en una enciclopedia interactivao un buscador la posible coincidencia en el tiempo de dos ideas o sidos personajes pudieron llegarse a conocer, que investigar paciente-mente a base de fichas hasta llegar a una conclusión. También es mássencillo hacer una búsqueda en un buscador que recorrer bibliotecas,aunque ahí queda mucho por hacer, y las propias bibliotecas se rein-ventan a sí mismas en la red con iniciativas de valor, incluso de carác-ter oficial, como Cervantes Virtual (www.cervantesvirtual.com), o Ariad-na, iniciativa de la Biblioteca Nacional encargada de recoger el Depó-sito Legal en España (http://www.bne.es/esp/servicios/index.htm) y queofrece un servicio de reproducción de documentos adaptado a las nue-vas tecnologías.

Pero, ante la sobrecarga de información, ¿cómo decidir la validezde algo encontrado en la Red? Los mecanismos de búsqueda utiliza-dos por los buscadores empiezan a ser problemáticos, ya que no siem-pre nos llevan al destino más idóneo, llegando a depender la oferta deinformación de factores económicos, que no ofrecen la seguridad deque lo encontrado es lo que necesitamos, ni en cantidad ni en calidad.Este problema aparece incluso en Wikipedia (http://www.wikipedia.org),con muchísima información valiosa, pero también otra un tanto ses-gada o partidista, y, en algunos casos, simplemente errónea. Una posi-ble solución se inició hace años en el M.I.T. (Instituto Tecnológico deMassachusetts) con el proyecto “Thesis on-line”, hoy convertido enDSpace (http://dspace.mit.edu/handle/1721.1/7582). Si hay un docu-mento que ha sido contrastado, validado, sometido a control y exa-men para cada afirmación, ése es una tesis. Y en DSpace encontramos¡más de 15.000! sobre todas las ramas del conocimiento humano. Aquítambién disponemos de iniciativas estatales importantes, comoTESEO, que permite consultar la base de datos de tesis doctoralesleídas desde 1976 hasta la actualidad (http://teseo.mec.es/teseo/jsp/teseo.jsp).

En España, también disponemos de iniciativas similares, vincula-das al entorno académico, como REI: base de datos de RecursosElectrónicos de Información, elaborada por la Universidad de la Rio-ja (http://biblioteca.unirioja.es), o todavía con más cobertura, es.Arxiv.org(http://xxx.unizar.es), servidor de distribución de papers de investiga-ción en formato electrónico y a texto completo iniciado por Los Ala-mos National Laboratory en 1991, que versa sobre información cientí-fica, especialmente en las ramas de Informática, Física y Matemáticas,Biología Cuantitativa y Estadística.

No quisiera terminar esta reflexión sin citar un sitio que es unauténtico monumento a Internet y su historia: www.archive.org, elArchivo de Internet, fundado por el millonario Brewster Khale (fun-dador de Alexia y creador de WAIS), que no solo presume de un archi-vo de 85.000 millones de páginas, sino que permite “recordar” el aspec-to y contenidos de cualquier sitio Web a lo largo de su historia median-te su herramienta WayBackMachine. Contrariamente a lo que he leí-do algunas veces, creo que la información nunca es excesiva, pero pue-de estar mal seleccionada. Ésa es, en gran parte, nuestra asignaturapendiente, dotar a nuestros recursos en Internet de esas capacidadesde selección. Información, sí. Pero inteligente.

Marino Posadas

Entrevista con Donald Knuth. Un documento para los curio-sos de la evolución de la informática. El famoso y muy vete-rano autor de “The Art of Computer Programming” ofrecesu visión del futuro del software y de la industria asociada. Paranostálgicos, más que nada, pues algunas de sus apreciacionesparecen más que superadas hoy dia. Pero, se esté o no de acuer-do, siempre resulta de interés. (Disponible en http://www.infor-mit.com/articles/article.aspx?p=1193856).

Los 25 proyectos punterosen investigación IT, segúnNetwork World. Desde uno

que pretende mapear todos los nodos existentes en Internety cómo se interconectan entre sí, hasta la creación de un joys-tick vocal. Requiere registro gratuito. (http://www.network-world.com/community/node/27057).

Blog de Brian Harry. Un maestro de la pro-gramación a bajo nivel, anteriormenteen el equipo de desarrollo del CLR de.NET, mantiene este blog dedicado a laque desde hace algunos años es su nue-va pasión: Team System. Visitas enhttp://blogs.msdn.com/bharry.

Hecgo. Dedicado especialmente a LINQ ytodo lo relacionado con esta tecnología deacceso a datos, en http://www.hecgo.com/category/linq (en castellano). Pero mere-ce la pena visitar el sitio desde su pági-na principal (http://www.hecgo.com/). No

se pierdan una entrada de citas célebres del mundo de lainformática. Contiene frases como “La Física es el siste-ma operativo del universo” –Steven R. Garman–, o “Elmayor enemigo del conocimiento no es la ignorancia, sinola ilusión del conocimiento.” –Stephen Hawking–.

WinBubble 1.7. Disponiblepara Windows Vista, setrata de una utilidad quepermite la personalizacióndel sistema operativo enlos aspectos de personali-zación, seguridad y opti-mización del rendimien-to. Recomendada por “Windows Secrets”, está disponi-ble en el sitio http://unlockforus.blogspot.com/2007/11/win-bubbles-features-gap.html. Además, incluye una herramientacomplementaria especial que permite al usuario crear suspropios trucos “My Tweaker Tool”.

documentos en la red

utilidades del mes

sitios del mes

Page 59: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases
Page 60: dedicada a los profesionales de la plataforma .NET LINQ · entidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados a modelos relacionales de bases