Está en la página 1de 21

Ao de la Inversin para el Desarrollo Rural y la Seguridad Alimentaria

Facultad de Ingeniera

Escuela Acadmica Profesional de Ingeniera de Sistemas y Computacin

UPLA
Universidad Peruana Los Andes
LINQ TO ENTITIES
UNIDAD DE EJECUCIN CURRICULAR: DESARROLLO DE SISTEMAS I

DOCENTE: VEGA FLORES, JORGE ALBERTO

ALUMNO: CAIRAMPOMA ARTETA, RENZO LUIS

HUANCAYO- PERU 2013

INDICE
DEDICATORIA ................................................................................................................................ 1 INTRODUCCION ............................................................................................................................. 2 1. 2. 3. 4. 5. 6. LINQ TO ENTITIES............................................................................................................ 3 QU ES LINQ TO ENTITIES?....................................................................................... 4 ORM-MAPEO OBJETO-RELACIONAL......................................................................... 4 ENTITY FRAMEWORK ..................................................................................................... 5 COMPARANDO LINQ PARA SQL CON LINQ A ENTIDADES ................................ 6 LAS CONSULTAS DE LINQ TO ENTITIES .................................................................. 7 6.1. 7. CONVERSIN DE LAS CONSULTAS .................................................................. 8

SINTAXIS DE CONSULTA .............................................................................................. 9 7.1. LOS OPERADORES DE CONSULTA ESTNDAR DE LINQ TO ENTITIES CONSULTAS .......................................................................................................................... 9 7.2. LOS OPERADORES DE CONSULTA ESTNDAR DE LINQ TO ENTITIES CONSULTAS ........................................................................................................................ 11 Proyeccin y filtrado Mtodos .................................................................................... 11 nete Mtodos .............................................................................................................. 11 Establecer mtodos...................................................................................................... 12 Mtodos Orden ............................................................................................................. 12

8.

Mtodos de agrupamiento .......................................................................................... 13 Mtodos de agregacin ............................................................................................... 13 Mtodos de Tipo ........................................................................................................... 15 Mtodos de paginacin................................................................................................ 15 LAMBDA ............................................................................................................................ 16

8.1. 8.2.

DECLARACIN ....................................................................................................... 17 EJEMPLOS DE FUNCIONES LAMBDA ............................................................. 17

WEBGRAFA:............................................................................................................................ 18

DEDICATORIA Les dedico este trabajo a mis padres porque siempre me brindan su apoyo incondicional en mi plan de ser profesional.

INTRODUCCION Actualmente, la mayor parte de las aplicaciones empresariales se escriben para tener acceso a datos de bases de datos relacionales. En algn momento, estas aplicaciones tienen que interactuar con los datos representados en un formato relacional. El modelo relacional est optimizado para conseguir un almacenamiento y recuperacin eficientes, no para el modelado conceptual que se usa en la programacin orientada a objetos. Varias tablas normalizadas suelen corresponder a una sola clase, y las relaciones entre las clases no se representan del mismo modo que las relaciones entre tablas.

1. LINQ TO ENTITIES

Entity Framework permite a los programadores trabajar con datos en forma de objetos y propiedades especficos del dominio, por ejemplo, con clientes y direcciones, sin tener que pensar en las tablas de las bases de datos subyacentes y en las columnas en las que se almacenan estos datos. A travs de la infraestructura de Servicios de objeto de Entity Framework, ADO.NET expone una vista conceptual comn de los datos, incluidos los datos relacionales, como objetos del entorno .NET. Esto hace que la capa de objetos sea un objetivo ideal para la compatibilidad con LINQ. Esta tecnologa LINQ, LINQ to Entities, permite a los programadores crear consultas flexibles, pero con establecimiento inflexible de tipos, en el contexto del objeto de Entity Framework mediante el uso de expresiones y de operadores de consulta estndar de LINQ directamente desde el entorno de desarrollo (Vase Figura 1.0).

Figura 1.0: Arquitectura de Linq to Entities 3

2. QU ES LINQ TO ENTITIES? LINQ to Entities es una nueva caracterstica de acceso a datos que est basado en ADO.NET Entity Framework. LINQ to Entities proporciona la capacidad de realizar consultas integradas en lenguajes (LINQ) que permite a los desarrolladores de software escribir consultas contra el modelo conceptual de Entity Framework mediante Visual Basic o Visual C#. Las consultas con Entity Framework se representan mediante consultas de rboles de comandos, que se ejecutan en el contexto del objeto. LINQ to Entities convierte las consultas de Language-Integrated Queries (LINQ) en consultas de rboles de

comandos, ejecuta las consultas en Entity Framework y devuelve objetos que se pueden usar tanto en Entity Framework como en LINQ.1 3. ORM-MAPEO OBJETO-RELACIONAL ORM es sinnimo de mapeo objeto-relacional. A veces se llama O / RM o mapeo O / R. Se trata de una tcnica de programacin que contiene un conjunto de clases que asignan bases de datos relacionales entidades a objetos en un lenguaje de programacin especfico. Cada base de datos est representada por un objeto de contexto de ORM en el lenguaje de programacin especfico, y base de datos de las entidades tales como tablas estn representadas por las clases, con las relaciones entre estas clases. Por ejemplo, el ORM puede crear una Alumno de clase para representar la tabla Alumno y

una matricula clase para representar la tabla matricula. El ORM es responsable de las asignaciones y las conexiones entre estas clases y la base de datos. As que, para la aplicacin, la base de datos ya est totalmente representada por estas clases. La aplicacin slo tiene que hacer frente a estas clases, en lugar de con la base de datos fsica. La aplicacin no tiene que preocuparse acerca de cmo conectarse a la base de datos, la forma de construir las sentencias SQL, cmo utilizar el mecanismo de bloqueo adecuado para garantizar la concurrencia, o cmo
1

http://msdn.microsoft.com/es-es/library/bb386964(v=vs.90).aspx

manejar las transacciones distribuidas. Estas actividades de base de datos relacionados son manejadas por el ORM. 4. ENTITY FRAMEWORK

ADO.NET Entity Framework (EF) es una nueva adicin a la familia de Microsoft ADO.NET. Permite crear aplicaciones de acceso a datos mediante programacin en contra de un modelo de aplicacin conceptual en lugar de programar directamente en un esquema de almacenamiento relacional. El objetivo es disminuir la cantidad de cdigo y el mantenimiento requerido para aplicaciones orientadas a datos. Aplicaciones de Entity Framework proporciona las siguientes ventajas: Las aplicaciones pueden trabajar en trminos de un modelo conceptual ms centrado en las aplicaciones, incluyendo tipos con herencia, miembros complejos y las relaciones. Las solicitudes se liberan de las dependencias incluidas en el cdigo en un motor de datos en particular o un esquema de almacenamiento. Correlaciones entre el modelo conceptual y el esquema de almacenamiento especficas pueden cambiar sin cambiar el cdigo de la aplicacin. Los desarrolladores pueden trabajar con un modelo de objetos de aplicacin coherente que se puede asignar a diferentes esquemas de almacenamiento, posiblemente ejecutados en diferentes sistemas de gestin de bases de datos. Varios modelos conceptuales se pueden asignar a un solo esquema de almacenamiento. Integrada Idioma Query (LINQ apoyo) proporciona la validacin de sintaxis en tiempo de compilacin Query en un modelo conceptual (Vase Figura 3.0).

Figura 3.0: Linq to Entities2

5. COMPARANDO LINQ PARA SQL CON LINQ A ENTIDADES

Caractersticas Modelo conceptual de datos Esquema de almacenamiento Esquema de asignacin Nuevo proveedor de acceso a datos Soporte de base de datos no SQL Server Conexin directa de base de datos Extensiones de lenguaje apoyan Procedimientos almacenados Herencia de tabla nica

LINQ para SQL No No No No No S S S S

LINQ a Entidades S S S S S No S S S

2 http://www.codeproject.com/Articles/246861/LINQ-to-Entities-Basic-Concepts-and-Features

Caractersticas Herencia mltiple de mesa Entidad nica de varias tablas Lazy Loading Support

LINQ para SQL No No S

LINQ a Entidades S S S

6. LAS CONSULTAS DE LINQ TO ENTITIES Una consulta es una expresin que recupera datos de un origen de datos. Las consultas se suelen expresar en un lenguaje de consulta especializado, como SQL para bases de datos relacionales y XQuery para XML. Por lo tanto, los programadores han tenido que aprender un lenguaje de consultas nuevo para cada tipo de origen de datos o formato de datos que consultan. LanguageIntegrated Query (LINQ) ofrece un modelo coherente y ms sencillo para trabajar con los datos de varios formatos y orgenes de datos. En una consulta de LINQ siempre se trabaja con objetos de programacin. Una operacin de consulta de LINQ consta de tres acciones: obtener el origen o los orgenes de datos, crear la consulta y ejecutar la consulta. Los orgenes de datos que implementan las interfaces

genricas IEnumerable<T> o IQueryable<T> pueden consultarse a travs de LINQ. Las instancias de la clase genrica ObjectQuery<T>, que implementa la interfaz genrica IQueryable<T>, actan como origen de datos para las consultas LINQ to Entities. La clase ObjectQuery<T> genrica representa una consulta que devuelve una coleccin de cero o ms objetos con tipo. Tambin puede hacer que el compilador deduzca el tipo de una entidad utilizando la palabra clave var de C# (Dim en Visual Basic). En la consulta se especifica exactamente la informacin que se desea recuperar del origen de datos. Una consulta tambin puede especificar cmo se debe ordenar, agrupar y conformar esa informacin antes de que se devuelva. En LINQ, una consulta se almacena en una variable. Si la consulta devuelve una secuencia de valores, la propia variable de la consulta debe ser de un tipo que se pueda consultar. Esta variable de consulta no realiza ninguna

accin y no devuelve datos; solamente almacena la informacin de la consulta. Tras crear una consulta debe ejecutarla para recuperar los datos.

6.1. CONVERSIN DE LAS CONSULTAS

Para ejecutar una consulta de LINQ to Entities en Entity Framework, se debe convertir a una representacin de rbol de comandos que se pueda ejecutar en Entity Framework.

Las consultas de LINQ to Entities estn compuestas de operadores de consulta estndar de LINQ (como Select, Where y GroupBy) y

expresiones (x > 10, Contact.LastName, etctera). Los operadores de LINQ no se definen en una clase, sino que son los mtodos de una clase. En LINQ, las expresiones pueden contener todo lo que permitan los tipos dentro del espacio de nombres System.Linq.Expressions y, por extensin, todo lo que se pueda representar en una funcin lambda. Se trata de un superconjunto de las expresiones permitidas por Entity Framework, que, por definicin, estn restringidas a las operaciones admitidas tanto en la base de datos como por ObjectQuery<T>. En Entity Framework, tanto los operadores como las expresiones se representan mediante una jerarqua de tipos simple, que despus se coloca en un rbol de comandos. Entity Framework usa el rbol de comandos para ejecutar la consulta. Si la consulta de LINQ no se puede expresar como un rbol de comandos, se producir una excepcin cuando se convierta la consulta. La conversin de las consultas de LINQ to Entities implica dos conversiones ms: la de los operadores de consulta estndar y la de las expresiones.

Hay varios operadores de consulta estndar de LINQ que no tienen una conversin vlida en LINQ to Entities. Si se intenta usar estos operadores, se producir una excepcin al convertir la consulta. Para obtener una lista de los operadores de LINQ to Entities admitidos, vea Mtodos admitidos y no admitidos de LINQ (LINQ to Entities).
8

Para obtener ms informacin sobre cmo usar los operadores de consulta estndar en LINQ to Entities, vea Operadores de consulta estndar en las consultas de LINQ to Entities.

En general, las expresiones de LINQ to Entities se evalan en el servidor, de modo que es previsible que el comportamiento de la expresin no siga la semntica de CLR. Para obtener ms informacin, vea Expresiones en consultas de LINQ to Entities.

Para obtener informacin sobre cmo las llamadas a mtodos de CLR se asignan a funciones cannicas del origen de datos, vea Asignar mtodo CLR a funcin cannica.

Para obtener informacin sobre cmo llamar a funciones cannicas, de base de datos y personalizadas desde consultas de LINQ to Entities, vea Llamar a funciones en consultas de LINQ to Entities.

7. SINTAXIS DE CONSULTA

LINQ to Entities puede estar compuesta de dos sintaxis diferentes: sintaxis de expresiones de consulta y sintaxis de consultas basadas en mtodos. Sintaxis de expresiones de consulta es nueva en C # 3.0 y Visual

7.1. LOS OPERADORES DE CONSULTA ESTNDAR DE LINQ TO ENTITIES CONSULTAS En una consulta, debe especificar la informacin que desea recuperar del origen de datos. Una consulta tambin puede especificar cmo se debe ordenar que la informacin, agrupados y en forma antes de ser devuelta. LINQ proporciona un conjunto de mtodos de consulta estndar que se puede utilizar en una consulta. La mayora de estos mtodos funciona en secuencias, en este contexto, una secuencia es un objeto cuyo tipo implementa la interfaz IEnumerable o la interfaz IQueryable interfaz. La funcionalidad de consulta de los operadores de consulta estndar incluye el
9

filtrado, proyeccin, agregacin, clasificacin, agrupacin, paginacin, etc. Algunos de los operadores de consulta estndar que se utilizan con ms frecuencia han dedicado sintaxis de palabras clave para que puedan ser convocadas por el uso de la sintaxis de expresiones de consulta. Una expresin de consulta es una forma diferente, ms legible para expresar una consulta que el equivalente basado en el mtodo. Clusulas de expresiones de consulta se traducen en llamadas a los mtodos de consulta en tiempo de compilacin. Para obtener una lista de los operadores de consulta estndar que tienen clusulas de expresiones de consulta equivalentes, consulte operadores de consulta estndar . 3 No todos los operadores de consulta estndar son compatibles con LINQ to Entities. Para obtener ms informacin, consulte Mtodos de LINQ admitidos y no admitidos (LINQ to Entities) . Este tema proporciona informacin acerca de los operadores de consulta estndar que es especfico de LINQ to Entities.Para obtener ms informacin acerca de los problemas conocidos en LINQ to Entities, vea

MTODOS DE COMBINACIN La combinacin es una operacin importante de las consultas dirigidas a orgenes de datos que no tienen relaciones navegables entre s. Una combinacin de dos orgenes de datos es la asociacin de objetos en un origen de datos con objetos de otro origen de datos que comparten un atributo o propiedad comunes. Los mtodos de combinacin son Join y GroupJoin. MTODOS DE AGRUPAMIENTO El agrupamiento hace referencia a la operacin de colocar los datos en grupos de manera que los elementos de cada grupo compartan un atributo comn. El mtodo de agrupamiento es GroupBy.

http://msdn.microsoft.com/es-es/library/bb399414(v=vs.90).aspx

10

7.2. LOS OPERADORES DE CONSULTA ESTNDAR DE LINQ TO ENTITIES CONSULTAS Proyeccin y filtrado Mtodos

Proyeccin refiere a la transformacin de los elementos de un conjunto de resultados en una forma deseada. Por ejemplo, se puede proyectar un subconjunto de las propiedades que necesita de cada objeto en el conjunto de resultados, se puede proyectar una propiedad y realizar un clculo matemtico en l, o que se pueda proyectar todo el objeto del conjunto de resultados. Los mtodos de proyeccin

son Select y SelectMany .

El filtrado se refiere a la operacin de restringir el conjunto de resultados para contener slo aquellos elementos que coinciden con una condicin especificada. El mtodo de filtrado es dnde .

La mayora de las sobrecargas de los mtodos de proyeccin y filtrado se admiten en LINQ to Entities, con la excepcin de los que aceptan un argumento posicional. nete Mtodos Unirse es una operacin importante en las consultas a orgenes de datos que no tienen relaciones navegables entre s. Una combinacin de dos fuentes de datos es la asociacin de los objetos en una fuente de datos con objetos en el otro origen de datos que comparten un atributo o propiedad comn. Los mtodos de combinacin

son nete y GroupJoin .

La mayora de las sobrecargas de los mtodos de combinacin son compatibles, con la excepcin de los que utilizan

un IEqualityComparer . Esto es debido a que el comparador no se puede convertir en el origen de datos.

11

Establecer mtodos

Establecer operaciones en LINQ son operaciones de consulta que basan su resultado conjuntos en la presencia o ausencia de elementos equivalentes dentro de la misma o en otra coleccin (o conjunto). Los mtodos de ajuste son todo

, Cualquier , Concat , Contiene , DefaultIfEmpty,Distinct , EqualAll, Salvo , Interseccin y unin . La mayora de las sobrecargas de los mtodos set se admiten en LINQ to Entities, aunque hay algunas diferencias de comportamiento en comparacin con LINQ to Objects. Sin embargo, los mtodos que utilizan un conjunto IEqualityComparer no son compatibles debido a que el comparador no se puede convertir en el origen de datos. Mtodos Orden

Orden, o clasificacin, se refiere a la ordenacin de los elementos de un conjunto de resultados sobre la base de uno o ms atributos. Si especifica ms de un criterio de clasificacin, puede romper los lazos dentro de un grupo. La mayora de las sobrecargas de los mtodos de ordenacin son compatibles, con la excepcin de los que utilizan un IComparer . Esto es debido a que el comparador no se puede convertir en el origen de datos. Los mtodos de

ordenacinson OrderBy , OrderByDescending , ThenBy , ThenByDes cending yReverse . Debido a que la consulta se ejecuta en el origen de datos, el comportamiento de pedido puede diferir de las consultas ejecutadas en el CLR. Esto se debe a opciones de pedido, como el caso ordenamiento, kanji pedido, y nulo el pedido, se puede configurar en el origen de datos. Dependiendo de la fuente de datos, estas opciones de ordenacin pueden producir resultados diferentes en el CLR.

12

Si especifica el mismo selector de llave en ms de una operacin de ordenacin, se producir un ordenamiento duplicado. Esto no es vlido y una excepcin ser lanzada. Mtodos de agrupamiento

Agrupacin se refiere a la colocacin de datos en grupos de manera que los elementos en cada grupo comparten un atributo comn. El mtodo de agrupamiento es GroupBy . La mayora de las sobrecargas de los mtodos de agrupamiento son compatibles, con la excepcin de los que utilizan

un IEqualityComparer . Esto es debido a que el comparador no se puede convertir en el origen de datos. Los mtodos de agrupamiento se asignan a la fuente de datos utilizando una clara sub-consulta para el selector de llave. La comparacin selector de llav sub-consulta se ejecuta utilizando la semntica de la fuente de datos, incluidas las cuestiones relacionadas con la comparacin nulos valores. Mtodos de agregacin

Una operacin de agregacin calcula un nico valor a partir de una coleccin de valores. Por ejemplo, el clculo de la temperatura media diaria del valor de un mes de los valores diarios de temperatura es una operacin de agregacin. Los mtodos de agregacin

son agregados , Promedio , Cuenta ,LongCount , Max , Min y Sum .

La mayora de las sobrecargas de los mtodos de agregacin son compatibles. Para el comportamiento relacionado con valores nulos, los mtodos de agregacin utilizan la semntica de fuente de datos. El comportamiento de los mtodos de agregacin cuando estn en juego valores nulos puede ser diferente, dependiendo de que se est utilizando fuentes de datos de back-end. Comportamiento de agregacin utilizando
13

la semntica del origen de datos tambin puede ser diferente de lo que se espera de los mtodos de CLR. Por ejemplo, el comportamiento predeterminado de la Suma mtodo en SQL Server es ignorar los valores nulos en lugar de lanzar una excepcin.

Las

excepciones

que

resultan

de

la

agregacin,

como

un

desbordamiento de la Suma funcin, se lanzan como excepciones de orgenes de datos o excepciones Entity Framework durante la materializacin de los resultados de la consulta.

Para aquellos mtodos que implican un clculo ms de una secuencia, tales como suma o media , el clculo real se realiza en el

servidor. Como resultado, conversiones de tipos y la prdida de precisin se pueden producir en el servidor, y los resultados pueden diferir de lo que se espera el uso de la semntica de CLR.

El comportamiento predeterminado de los mtodos de agregacin para valores nulos / no nulo se muestra en la siguiente tabla:

Mtodo

No hay datos

Todos los valores nulos

Algunos valores nulos Devuelve el promedio de los valores no nulos en una secuencia. Devuelve el nmero de valores nulos y no nulo en la secuencia.

No hay valores nulos Calcula el promedio de una secuencia de valores numricos.

Promedio

Devuelve nulo.

Devuelve nulo.

Contar

Devuelve 0

Devuelve el nmero de valores nulos en la secuencia.

Devuelve el nmero de elementos de la secuencia.

14

Max

Devuelve nulo.

Devuelve nulo.

Devuelve el valor mximo no nulo en una secuencia. Devuelve el valor no nulo mnimo de una secuencia. Devuelve la suma de los valores no nulos en una secuencia.

Devuelve el valor mximo de una secuencia.

Min

Devuelve nulo.

Devuelve nulo.

Devuelve el valor mnimo de una secuencia.

Suma

Devuelve nulo.

Devuelve nulo.

Calcula la suma de una secuencia de valores numricos.

Mtodos de Tipo Los dos mtodos de LINQ que tienen que ver con la conversin de tipo y pruebas es ambos apoyados en el contexto de Entity Framework. Esto significa que los nicos tipos admitidos son los tipos que se asignan al tipo Entity Framework correspondiente. Para obtener una lista de este tipo, vea Tipos del Entity Data Model . Los mtodos del tipo

estn Convertir y OFTYPE . OfType es compatible con los tipos de entidad. Convert es apoyado por modelos conceptuales tipos primitivos. El C # es y como tambin se apoyan mtodos. Mtodos de paginacin

Operaciones de paginacin devuelven un nico elemento especfico de una secuencia. Los mtodos de elementos

son ElementAt , Primera , FirstOrDefault, pasado , LastOrDefault , in dividual , Saltar , Tome , TakeWhile . No se admiten Un nmero de los mtodos de paginacin, ya sea debido a la incapacidad para asignar funciones a la fuente de datos o a la falta
15

de implcita ordenamiento de conjuntos en la fuente de datos. Los mtodos que devuelven un valor por defecto se limitan a modelos conceptuales tipos primitivos y tipos de referencia con valores predeterminados nulos. Mtodos de paginacin que se ejecutan en una secuencia vaca devolver null.

8. LAMBDA Una expresin lambda es una funcin o una subrutina sin nombre que se puede utilizar donde haya un delegado vlido. Las expresiones lambda se usan en consultas de LINQ basadas en mtodos como argumentos de los mtodos de operador de consulta estndar, tales como Where. Son ampliamente usadas en el ORM de Microsoft, Entity Framework, donde se puede ver claramente todo su potencial. Lambda son funciones, es decir, un conjunto de instrucciones capaces de retornar un valor partiendo de los parmetros que se les suministra, aunque en determinados casos es posible que no reciba ningn parmetro, o que realicen una accin sin retornar nada. Igual que una funcin tradicional. Y de hecho, en el cuerpo de una expresin lambda puede haber casi de todo: llamadas a otras funciones, expresiones, bucles, declaraciones de variables. Sin embargo, a diferencia de los mtodos o funciones habituales, las lambdas no necesitan de un identificador, puesto que se declaran justo en el momento en que van a asignarse a una variable o a utilizarse como parmetro de una funcin, pasando el destinatario de esta asignacin a actuar como delegado, o puntero, hacia la misma, o a ser el contenedor del rbol de expresin que la representa.

16

8.1. DECLARACIN Una expresin lambda se declara mediante la siguiente sintaxis:

param => expr - param ser la lista de parmetros separados por comas - => es la separacin entre los parmetros y la declaracin de la funcin - expr es la implementacin de la funcin

8.2. EJEMPLOS DE FUNCIONES LAMBDA


num => num * 2 // Lambda con un parmetro que retorna // el doble del valor que se le pasa. // Lambda con dos parmetros que retorna // la suma de ambos. // Funcin que divide un nmero entre 10 //Funcin que divide dos nmeros // Funcin que multiplica un nmero por dos

(a, b) => a + b

n => n / 10 . (x,y) => x / y.

N => { N = n*2; return n;}.

num => { // Lambda con cuerpo que recibe un int x = new Random().Next(); // entero, y retorna la suma de ste return num+x; // con un nmero aleatorio.

} () => DateTime.Now // Lambda que no recibe parmetros // y retorna la fecha y hora del sistema. msg => Console.WriteLine(msg); // Recibe un parmetro, realiza una // accin y no retorna nada.

El tipo de retorno es inferido por el contexto. Tambin destacar que si se realizan varias operaciones es necesario utilizar return. Los parntesis slo son obligatorios cuando hay ms de un parmetro.
17

WEBGRAFA:
LINQ to Entities. 2013 Microsoft. http://msdn.microsoft.com/enus/library/bb386964.aspx

Operadores de consulta estndar en las consultas de LINQ to Entities. 2013 Microsoft.http://msdn.microsoft.com/es-es/library/bb738551.aspx

18