Está en la página 1de 15

Funcionalidad del lenguaje integrado de consultas (LINQ), con ejemplos en Visual Basic.

NET
Functionality o integrated !ueries language (LINQ), "it# e$amples in Visual Basic.NET
%arlos &l'erto Vanegas
1
(esumen
Uno de los grandes retos de la programacin orientada a objetos es facilitar la combinacin y el
acceso a cualquier tipo de informacin, como una caracterstica integrada a un lenguaje de
programacin. Con el lenguaje integrado de consultas LINQ de .N! "rame#or$ se pueden crear
consultas no solo de bases de datos relacionales y %&L, sino tambi'n de matrices, colecciones en
memoria, conjunto de datos ()*.N! o cualquier otro tipo de datos que admita LINQ. Las
consultas integradas en los lenguajes .N! definen un conjunto de operadores de consulta est+ndar
que ,acen posible las operaciones de consulta, filtrado, enumeracin y proyeccin. LINQ fue
integrado en -isual .tudio /001 en el .N! "rame#or$ 2.3 e incluidas en los lenguajes de
programacin C4 y -isual 5asic. ste artculo ,ace una descripcin de las funcionalidades y
caractersticas del lenguaje estructurado de consultas con ejemplos en el lenguaje de programacin
-isual 5asic.N!.
)ala'ras cla*e+ marcos de trabajo, LINQ 6lenguaje estructurado de consultas7, origen de datos,
consultas, coleccin.
&'stract
*ne of t,e great c,allenges of object8oriented programming is to facilitate t,e combination and
access to any information, suc, as an integrated feature of a programming language. 9it, t,e
integrated language of queries LINQ of .N! "rame#or$ can not only create queries relational
databases and %&L, but also arrays, collections in memory, ()*.N! )ataset or any ot,er data
1
Ingeniero de Sistemas, Universidad Incca de Colombia, Especialista en Ingeniera de Software,
Universidad Distrital Francisco Jos de Caldas, agster en Ingeniera de Sistemas, Universidad !acional
de Colombia, docente investigador del gr"po Comp"#aralela adscrito a la Fac"ltad $ecnol%gica de la
Universidad Distrital Francisco Jos de Caldas& Correo electr%nico' cavanegas("distrital&ed"&co
t,at supports LINQ. !,e integrated query .N! languages defines a set of standard query operators
t,at allo# query operations, filtering, enumeration and projection list. LINQ #as integrated into t,e
-isual .tudio /001 in .N! "rame#or$ 2.3 and included in t,e programming languages C 4 and
-isual 5asic. !,is article gi:es a description of t,e features and c,aracteristics of structured query
language #it, e;amples in t,e programming language -isual 5asic.N!.
,ey "ords+ "rame#or$, LINQ 6language integrated query7, data source, query, collection.
Introducci-n
l lenguaje integrado de consultas LINQ 6Language Integrated Query7 es un proyecto de &icrosoft
que permite reali<ar consultas similares a las de .QL
/
, cuya funcionalidad fue incluida en -isual
.tudio /001, inicialmente en los lenguajes de programacin -isual 5asic .N! y C4 de la
plataforma .N! "rame#or$ 2.3
2
. LINQ es capa< de agregar esquemas est+ndares, eficaces y
sencillos a la sinta;is de los lenguajes de programacin C4 y -isual 5asic.N! para consultar y
reno:ar datos.
=eneralmente las consultas de datos se formulan como cadenas sencillas que no comprueban los
tipos de datos en tiempo de compilacin ni contienen las caractersticas intellisense
>
. LINQ permite
que las consultas sean datos estructurados que representan informacin, adem+s :erifican la sinta;is
del lenguaje en tiempo de compilacin, los errores en compilacin y se obtienen todas las
caractersticas intellisense del lenguaje. s por ello que LINQ define un conjunto de operadores de
consulta est+ndares que permiten las operaciones de consulta, filtrado, enumeracin y proyeccin
de diferentes de datos, matrices, %&L, bases de datos relacionales y orgenes de datos de terceros.
sto permite que los datos que est'n en memoria se puedan manipular de una forma m+s r+pida, lo
que beneficia el rendimiento de las aplicaciones.
)ro*eedores LINQ
)
*eng"a+e de cons"lta estr"ct"rado&
,
Componente integral de -indows ."e proporciona "n entorno para varios leng"a+es basado en
est/ndares&
0
#roporciona elementos de c%digo l%gicos ."e se p"eden seleccionar en "n men1 desplegable c"ando se
escribe c%digo&
Un pro:eedor LINQ reali<a una consulta y la traduce en comandos que podr+ ejecutar el origen de
datos, adem+s con:ierte los datos del origen en los objetos que obtienen los resultados de la
consulta. &icrosoft suministra los siguientes pro:eedores LINQ?
LINQ to .'jects? @ermite consultar colecciones y matrices en memoria, implementando
Inumerable
3
ABC.
LINQ to /0L? @ermite consultar y modificar arc,i:os %&L. @uede modificar %&L en
memoria o cargarlos desde un arc,i:o. (dmite crear literales %&L
D
, lo que permite mediante
programacin la creacin de elementos, documentos y fragmentos %&L A/C.
LINQ to &1..NET
2
? A2C @ermite la utili<acin de consultas en objetos de bases de datos. sta
a su :e< se di:ide en?
o LINQ to 3QL? permite consultar, modificar, actuali<ar y eliminar datos de una base de
datos .QL .er:er. .N! incluye un diseEador relacional de objetos, el cual permite crear
un modelo de objetos en una aplicacin que se asigna a objetos de una base de datos. s
decir, con:ierte a .QL las consultas en un modelo de objetos y las en:a a la base de
datos para su ejecucin.
o LINQ to 1ata3et
4
?A>C permite consultar, actuali<ar y agregar los datos de un conjunto
de datos ()*.N! ya sea un )ata.et normal6solo cdigo7 o tipeado 6se incluyen
m'todos y se puede :er su organi<acin gr+ficamente7.
o LINQ to Entities+ permite la consulta de los modelos de datos de entidad creados por el
*F&
5
ntity "rame#or$
B0
A3C.
2
Interface ."e posee "n con+"nto de elementos de "n mismo tipo 3arra4, vector, lista5 ."e permiten el
acceso de manera est/ndar&
6
#ermite incorporar directamente 7* en el c%digo de 8is"al 9asic&!E$&
:
Con+"nto de clases ."e permiten el acceso a datos de &!E$&
;
<epresenta "n con+"nto de datos en memoria&
=
>b+eto relacional de mapeo de "na base de datos&
1?
Componente de @D>&!E$ ."e Aabilita el acceso a bases de datos mediante *I!B&
1BLin!+ @ro:eedor similar a LINQ a .QL que permite usar bases de datos diferentes a .QL
.er:er.
.peradores de consulta LINQ
Los operadores de consultas LINQ son m'todos que constituyen el modelo LINQ y se pueden
operar con cualquier pro:eedor y funcionan en secuencias, donde una secuencia es un objeto que
implementa las interfaces Inumerable y IQueryable
BB
. Con LINQ se pueden adoptar uno o :arios
operadores de consulta est+ndar, que permiten obtener un resultado efica< sobre un conjunto de
datos. stos operadores de consulta se encuentran en el ensamblado .ystem.Core.dll dentro del
espacio de nombres 3ystem.Lin!. @ueden usarse en objetos que implementan InumerableG!H o
IQueryableG!HADC. sto les permite operar con :arios tipos, desde colecciones y matrices
6secuencias7 en memoria ,asta bases de datos remotas que usan pro:eedores como LINQ to ntities
y LINQ to .QL AIC.
Los operadores de consulta tienen diferentes modos de ejecucin? inmediato, apla<ado, con
transmisin por secuencias, sin transmisin por secuencias. La ejecucin inmediata lee el origen de
datos y origina el resultado en donde se declara la consultaJ en la ejecucin apla<ada el resultado
depende del origen de los datos, es decir que los resultados pueden ser diferentes al ejecutarse la
consultaJ los operadores con transmisin por secuencia no leen todos los datos del origen para
proporcionar los elementos del resultadoJ los operadores sin transmisin por secuencias tiene que
leer todos los datos de origen para proporcionar los elementos de resultado.A1C
;isten diferentes tipos de operadores, los principales se muestran a continuacin?
6. .peradores de agregaci-n? son operadores que calculan un :alor Knico a partir de una
coleccin de :alores. Los m'todos de reali<an las operaciones de agregacin son?
o &ggregate? reali<a una operacin de agregacin de una coleccin de :alores.
o &*erage? calcula el promedio de una serie de :alores num'ricos.
11
Interface ."e proporciona f"nciones para eval"ar cons"ltas con respecto a "n origen de datos&
o %ount? de:uel:e un nKmero entero con la cantidad de elementos de una coleccin de
:alores.
o Long%ount? de:uel:e un nKmero decimal con la cantidad de elementos de una
coleccin de :alores.
o 0in? encuentra el nKmero menor de una coleccin de nKmeros.
o 0a$? encuentra el nKmero mayor de una coleccin de nKmeros.
o 3um? obtiene la sumatoria de una coleccin de nKmeros.
7. .peradores de concatenaci-n? reali<a la operacin de unir una coleccin con otra. l
m'todo de concatenacin es?
o %oncat? une dos colecciones de datos para formas una nue:a coleccin.
8. .peradores de con*ersi-n? son operaciones que permiten cambiar el tipo de los objetos de
entrada de una coleccin. .us m'todos son?
o %ast+ con:ierte los elementos de una coleccin en un tipo de datos especfico.
o .Type? permite filtrar los elementos de una coleccin por un tipo de datos
especfico.
o To&rray? con:ierte en un :ector una coleccin de datos.
o ToList? con:ierte a una lista una coleccin de datos.
9. .peradores de elementos? son operaciones que de:uel:en un Knico elemento especfico de
una coleccin. Los m'todos de los operadores de elementos son?
o Element&t? de:uel:e el elemento de un ndice especfico de una coleccin de datos.
o Elementat.r1eault? de:uel:e el elemento de un ndice especfico de una
coleccin de datos o un :alor determinado si el ndice se encuentra fuera de un
inter:alo.
o First? de:uel:e el primer elemento de una coleccin.
o Fist.r1eault? de:uel:e el primer elemento de una coleccin o el primer :alor
especifico si no se encuentra ningKn elemento.
o Last? de:uel:e el Kltimo elemento de una coleccin.
o Last.r1eault? de:uel:e el Kltimo elemento de una coleccin o el Kltimo :alor
especifico si no se encuentra ningKn elemento.
:. Igualdad? se considera una operacin de igualdad si los elementos correspondientes de dos
colecciones son iguales y las dos colecciones tiene el mismo nKmero de elementos. l
m'todo de esta operacin es?
o 3ecuenceE!ual? compara dos colecciones para determinar si son iguales.
;. .peradores de generaci-n? operadores que generan una nue:a coleccin a partir de otra.
.us m'todos son?
o Empty+ genera una coleccin :aca.
o (ange? genera una coleccin en relacin con un inter:alo.
o (epeat? genera una coleccin de un Knico elemento, un nKmero determinado de
:eces.
2. .peradores de agrupaci-n? colocan los elementos de una coleccin en grupos que
compartan una condicin comKn. .us m'todos son?
o <roupBy? agrupa los elementos de una coleccin por una agrupacin definida.
o =oin? une dos colecciones.
o <roup=oin? reali<a una unin agrupada de elementos de dos colecciones.
4. .peradores de ordenaci-n? operaciones que ordenan los elementos de una coleccin segKn
uno o m+s condiciones. Los m'todos son?
o .rderBy? ordena los elementos de una coleccin en forma ascendente.
o .rderBy1escending? ordena los elementos de una coleccin en orden descendente.
o T#enBy? operacin secundaria que ordena los elementos de una coleccin en forma
descendente.
o T#enBy&scending? operacin secundaria que ordena los elementos de una
coleccin en forma ascendente.
o (e*erse? ordena los elementos de una coleccin en forma in:ersa.
5. .peradores de proyecci-n? son operaciones que transforman o construyen un nue:o
conjunto de elementos generado a partir de una coleccin.
o 3elect? permite crear una proyeccin de los elementos de una coleccin.
o 3elect0any? permite crear una proyeccin de uno o :arios elementos de una
coleccin.
6>. .peradores de cuantiicaci-n? estos operadores de:uel:en un :alor booleano si alguno o
todos los elementos de un coleccin cumplen una condicin.
o &ll? de:uel:e :erdadero si todos los elementos de una coleccin cumplen una
condicin.
o &ny? de:uel:e :erdadero si alguno de los elementos de una coleccin cumplen una
condicin.
o %ontains? de:uel:e :erdadero si en una coleccin un elemento cumple una
condicin especfica.
o ?#ere? de:uel:e :erdadero si se cumple una condicin de filtrado.
66. .peradores de conjunto? son operaciones que generan un conjunto de resultados a partir
de la e;istencia o no de elementos de una coleccin o :arias colecciones.
o 1istinct? elimina los elementos repetidos de una coleccin.
o E$cept? de:uel:e los elementos de una coleccin que no e;isten en una segunda
coleccin.
o Intersect? de:uel:e los elementos comunes entre dos colecciones de datos.
o @nion? de:uel:e todos los elementos de dos colecciones.
Estructuraci-n de una consulta LINQ
Una consulta es una e;presin que recupera datos u obtiene resultados de un origen de datos, la cual
est+ conformada por una combinacin de cl+usulas que identifican los orgenes de datos y las
:ariables de iteracin de la consulta. . n una consulta LINQ siempre se trabajan objetos, utili<ando
los mismos modelos de instrucciones para consultar y con:ertir los datos de diferentes orgenes de
datos. @ara definir y utili<ar consultas LINQ se deben reali<ar tres acciones?
6. .'tener el origen de datos u orAgenes de datos? .e debe especificar cu+les ser+n los datos
que se :an a utili<ar y donde est+n.
7. %rear la consulta? .e especifica la informacin que se desea obtener del origen de datos,
estos, se pueden ordenar, filtrar, agrupar, etc.
8. Ejecutar la consulta? La ejecucin de la consulta es un proceso independiente de la
creacin. .e puede ejecutar cuando este definida 6ejecucin inmediata7 o se puede guardar y
ejecutarse posteriormente 6ejecucin diferida7.
La ejecucin y la creacin de una consulta LINQ son operaciones distintas, el ,ec,o de crear una
consulta, no significa la recuperacin de datos.
Una e;presin de consulta contiene tres cl+usulas? From o &ggregate, 3elect y ?#ere. From es
una cl+usula inicial de una consulta y especifica el origen de datos y las :ariables de iteracin que
se usan sir:en para referenciar cada elemento del origen de datos por separado. &ggregate, tambi'n
es una cl+usula inicial y aplica una o m+s funciones de agregado a un origen de datos, en este caso
la cl+usula From es opcional. 3elect especifica la forma y el contenido de los datos que ser+n
de:ueltos y ?#ere se utili<a para filtrar datos de un origen de datos.
n el siguiente ejemplo se muestran las tres partes de una operacin de consulta. .e utili<a un
:ector de nKmeros como origen de datos. La consulta debe dar como resultado todos los nKmeros
enteros mayores de B0.
.rigen de datos
*aria'le :ector67 es entero L MB/,/,>,3>,1N,I3,B,/B,B1,DO
%reaci-n de la consulta
*aria'le obtenernumeros L From numeros In :ector
?#ere numeros H B0
3elect numeros
Ejecutar la consulta
Para cada n"mero En obtenern"meros
Imprimir 3n"mero5
%onsultas LINQ en Visual Basic.NET
l lenguaje integrado de consultas LINQ es una de las funcionalidades de consulta que tiene el
lenguaje de programacin -isual 5asic .N! ANC, y permite la creacin de consultas sencillas,
f+ciles y eficaces con todo tipo de dato., en otras palabras con LINQ se pueden crear consultas
como parte de la sinta;is del lenguaje de programacin -isual 5asic. N! independiente del tipo de
dato. AB0C
n este aparte se crean ejemplos de consultas LINQ utili<ando el entorno de programacin del
lenguaje -isual 5asic .N! utili<ando el tipo de proyecto aplicaci-n de consola, donde se
manipular+n algunos de los operadores de consultas LINQ mencionados anteriormente.
Ejemplo 6? .i se tiene la siguiente matri<?
numerosLMB0,/0,3,1N,>B,3D,B1,/2,3/O
a. *btener el promedio de los :alores de la matri< nKmeros.
1im promedio (s 1ou'le L &ggregate :aloresPpromedio In numeros Into &*erage67
%onsole.?rite6Ql promedio de los nKmeros es?R S promedio7
Figura 6. )romedio de los nBmeros.
'. *btener la suma de los :alores de la matri< numeros.
1im suma (s Integer L &ggregate sumanumeros In numeros Into sum67
%onsole.?rite6QLa suma de los nKmeros es?R S suma7
Figura 7. 3uma de los nBmeros.
c. Imprimir los :alores de la matri< numeros en forma ascendente.
1im ordenar L From :aloresPordenados In numeros .rder By :aloresPordenados
For Eac# :alor In ordenar
%onsole.?rite6:alor S T,T7
Ne$t
Figura 8. .rdenamiento de los nBmeros en orma ascendente.
d. )eterminar si e;iste el nKmero 1N en la matri< numeros.
1im :alorPe;iste L &ggregate numero In numeros into &ny6numeroL1N7
IF (*alorCe$isteDtrue) t#en
%onsole.?rite6T;iste el nKmero 1NT7
Else
%onsole.?rite6TNo ;iste el nKmero 1NT7
End I
Figura 9. E$istencia de un nBmero especiico en el *ector.
Ejemplo 7? .i se tiene la siguiente matri<?
nom'resL MQcarlosR, RrosaR, QcristianR ,RangelitaR, QandresR, QjuliaRO
a. *rdenar cada elemento de la matri< nom'res en orden descendente.
1im ordenarPnombres L From ordena In nombres .rder By ordena 1escending
For Eac# orden In ordenarPnombres
%onsole.?rite6orden S T,T7
Ne$t
Figura :. .rdenamiento de la matriE nom'res.
'. *btener los nombres que contengan la letra i en la matri< nom'res.
1im obtenerPnombres D From obtenerPi In nombres ?#ere obtenerPi.%ontains(FiF)
For Eac# nombresPconPi In obtenerPnombres
%onsole.?rite6nombresPconPi S T,T7
Ne$t
Figura ;. Nom'res !ue contiene la letra i.
c. Imprimir
la primera letra de cada elemento de la matri< nom'res.
1im primera L From letra In nombres 3elect letra.3u'string60, B7
For Eac# primeraPletra In primera
%onsole.?rite6primeraPletra S T,T7
Ne$t
Figura 2. )rimera letra de los elementos de la matriE nom'res.
d. Imprimir todos los elementos de la matri< nom'res cuya longitud sea mayor que D.
1im palabras L From palabrasPD In nombres ?#ere palabrasPD.Lengt# G D
For Eac# palabraPmayorPD In palabras
%onsole.?rite6palabraPmayorPD S T,T7
Ne$t
Figura 4. Elementos de la matriE nom'res cuya longitud es mayor !ue ;.
Ejemplo 8? .e supondr+ que se tiene en una base de datos 6se utili<a la plantilla %lases de LINQ
To 3QL de -isual 5asic .N! para crear la base de datos y las tablas7 que contiene dos tablas?
productos y *entas con la siguiente informacin?
)roductos Ventas
%-digo &rticulo %antidad Valor %-digo %antidad
B0 reglas B/ B/00 B0 B3
/0 bolgrafos /> /000 B0 /0
20 l+pices 23 I00 /0 >1
>0 cuadernos 1 B300 20 B/
30 colores B> /000 /0 1I
Ta'la 6+ Ta'las productos y *entas.
a. Imprimir el cdigo y el nombre de los artculos de la tabla productos cuyo cdigo sea
mayor que 20.
1im consulta L From misproductos In :ista.productos ?#ere misproductos.codigo H 20
3elect misproductos.codigo, misproductos.articulo
For Eac# codigos In consulta
%onsole.?riteLine6codigos7
Ne$t
Figura 5. %-digos y nom're de los articulos cuyo codigo es mayor !ue 8>.
'. Imprimir los registros de la tabla productos cuyo nombre de artculo sea igual a cuadernos.
1im consulta L From misproductos In :ista.productos
?#ere misproductos.articuloLRcuadernosR
3elect misproductos.codigo, misproductos.articulo, misproductos.cantidad,
misproductos.:alor
For Eac# articulos In consulta
%onsole.?riteLine6articulos7
Ne;t
Figura 6>. &rticulos cuyo nom're es igual a cuadernos.
c. Imprimir de la tabla *entas todos los cdigos e;istentes sin repetir cdigos.
1im unicocodigo L From obtenercodigo In :ista.:entas
3elect obtenercodigo.codigo 1istinct
%onsole.?riteLine6TImprimir un Knico codigo de la tabla :entasT7
For Eac# :ercodigos In unicocodigo
%onsole.?rite6:ercodigos S T,T7
Ne$t
Figura 66. Imprimir un Bnico c-digo de la ta'la *entas.
d. Imprimir por cada registro de la tabla *entas, el cdigo, el nombre y el :alor de la tabla
productos y la cantidad de la tabla *entas.

1im consulta L From misproductos In :ista.productos =oin mis:entas In :ista.:entas .n
mis:entas.codigo E!uals misproductos.codigo
3elect misproductos.codigo, misproductos.articulo, mis:entas.cantidad,
misproductos.:alor
%onsole.?riteLine6T-entas de @roductosT7
For Eac# codigos In consulta
%onsole.?riteLine6codigos7
Ne$t
Figura 67. Impresi-n de los productos *endidos.
%onclusiones
l lenguaje integrado de consultas LINQ de .N! "rame#or$ permite crear consultas con
bases de datos relacionales, %&L, matrices, colecciones en memoria, conjunto de datos
()*.N! o cualquier otro tipo de datos.
Las consultas LINQ se pueden crear f+cilmente desde el entorno de programacin del
lenguaje -isual 5asic.N!.
Los operadores de consultas LINQ son similares a las consultas .QL.
Los operadores de consultas LINQ se pueden utili<ar con cualquier pro:eedor.
Las consultas LINQ se pueden comprobar en tiempo de compilacin y adem+s contienen la
caracterstica Intellisense.
(eerencias
InograAas primarias
ABC Inumerable Interface. )isponible en? ,ttp?UUmsdn.microsoft.comUen8
usUlibraryUsystem.collections.ienumerable.asp;
A/C Informacin general sobre literales. )isponible en? %&L,,ttp?UUmsdn.microsoft.comUes8
esUlibraryUbb21>D/N.asp;
A2C ()*.N!. )isponible en? ,ttp?UUmsdn.microsoft.comUes8esUlibraryUe10y3y,;6:L:s.107.asp;
A>C )ata.et. )isponible en? ,ttp?UUmsdn.microsoft.comUes8esUlibraryUssIfbae<.asp;
A3C ()*.Net ntity "rame#or$. )isponible en? ,ttp?UUgee$s.msUblogsUciinUarc,i:eU/001U0BU/3Uado8
net8entity8frame#or$8linq8to8entities8entity8 s.lC4Centit4CservicesCi&aspD
E6F IQueyable 6interfa<7. )isponible en? Attp'GGmsdn&microsoft&comGesC
esGlibrar4Gs4stem&lin.&i."er4able&aspD
E:F >peradores de cons"lta est/ndar con *I!B. )isponible en? Attp'GGmsdn&microsoft&comGesC
esGmagaHineGcc,,:;=,&aspD
E;F Clasificacin de operadores. )isponible en? Attp'GGmsdn&microsoft&comGesC
esGlibrar4Gbb;;)601&aspD
E=F Inicio de -isual 5asic. )isponible en? Attp'GGmsdn&microsoft&comGesCesGvbasicGms:;=?26
E1?F Introduccin a LINQ en -isual 5asic. )isponible en? Attp'GGmsdn&microsoft&comGesC
esGlibrar4Gbb:6,?6;&aspD
InograAas secundarias
E11F Attp'GGmsdn&microsoft&comGesCesGlibrar4Gbb2061,;&aspD
E1)F Attp'GGmsdn&microsoft&comGesCesGlibrar4Gbb20616)&aspD
E1,F Attp'GGmsdn&microsoft&comGesCesGlibrar4Gbb2061,=&aspD
E10F Attp'GGmsdn&microsoft&comGesCesGlibrar4Gbb20616?3vIvs&=?5&aspD
E12F Attp'GGmsdn&microsoft&comGesCesGlibrar4Gbb2061)=3vIvs&=?5&aspD
E16F Attp'GGmsdn&microsoft&comGesCesGlibrar4Gbb206102&aspD
E1:F Attp'GGmsdn&microsoft&comGesCesGlibrar4Gbb20610?3vIvs&=?5&aspD
E1;F Attp'GGmsdn&microsoft&comGesCesGlibrar4Gbb20616;&aspD
E1=F Attp'GGmsdn&microsoft&comGesCesGlibrar4Gbb2061);&aspD
E)?F Attp'GGmsdn&microsoft&comGesCesGlibrar4Gbb20612,&aspD
E)1F J
a

b
K-Aat is >b+ectG<elational appingLK& Hibernate Overview& J9>SS Mibernate&
E))F Attp'GGwww&Aibernate&orgGabo"tGorm& <etrieved 1= @pril )?11&

También podría gustarte