ExecuteQuery (en linQ)

05/11/2007 - 17:47 por Carla Rincon | Informe spam
Hola de nuevo.

Quiero saber si puedo hacer que el resultado de una llamada a ExecuteQuery
se entre a un DataTable?

Lo pongo asi:

var tab = DC.ExecuteQuery<System.Data.DataTable>(@"select codigo, nombre
from tabclientes");

//DC es el datacontext de linq.

Me compila bien pero al ejecutarlo me da error.


Carla Rincon

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
05/11/2007 - 20:49 | Informe spam
Hola, Carla,

El parámetro de tipo que le pasas a ExecuteQuery no puede ser un DataTable,
ni tampoco un DataRow.

Si el DataTable no es tipado el problema no es trivial, porque la clase
DataRow no tiene constructures accesibles. Te recomendaría crearte una clase
con la estructura correspondiente a las tuplas que quieres recuperar. Y
luego te recomendaría
usar LINQ to DataSet (agregar referencia a System.Data.DataSetExtensions y
luego en el código hacer "using System.Data.DataSetExtensions;"). Ahí hay un
método extensor CopyToDataTable que sirve para "copiar" un
IEnumerable<DataRow> a un DataTable.

Te paso un ejemplo de cómo hacerlo. Utilizo nombres y fechas de nacimiento
de futbolistas en vez de código y nombre de clientes, pero en el fondo es lo
mismo. Bueno, y utilizo una consulta integrada "de verdad" en vez de
ExecuteQuery() ;-)

Saludos - Octavio

*******************************************
internal class MyDataTable : DataTable
{
internal MyDataTable()
: base()
{
Columns.Add("Nombre", typeof(string));
Columns.Add("FechaNacimiento", typeof(DateTime));
}

internal DataRow MakeDataRow(string nombre, DateTime dt)
{
DataRow dr = this.NewRow();
dr.BeginEdit();
dr[0] = nombre;
dr[1] = dt;
dr.EndEdit();
return dr;
}
}
private static void ExportarDataTable()
{
using (FutbolDataContext ctx = new FutbolDataContext())
{
ctx.Log = Console.Out;
MyDataTable dt = new MyDataTable();
dt.TableName = "Portugueses";
// consulta LINQ to SQL
var x = from f in ctx.Futbolista
where f.CodigoPaisNacimiento == "PT"
select dt.MakeDataRow(f.Nombre,
f.FechaNacimiento.Value);
// copiar datos a DataTable
x.CopyToDataTable(dt, LoadOption.OverwriteChanges);

// comprobación
foreach (DataRow dr in dt.Rows)
Console.WriteLine(dr[0]);
}
}
*******************************************



"Carla Rincon" <_> wrote in message
news:
Hola de nuevo.

Quiero saber si puedo hacer que el resultado de una llamada a ExecuteQuery
se entre a un DataTable?

Lo pongo asi:

var tab = DC.ExecuteQuery<System.Data.DataTable>(@"select codigo, nombre
from tabclientes");

//DC es el datacontext de linq.

Me compila bien pero al ejecutarlo me da error.


Carla Rincon



Respuesta Responder a este mensaje
#2 Carla Rincon
05/11/2007 - 23:48 | Informe spam
Gracias Octavio.

Creo que mejor definire mi clase <Cliente> para que me devuelva un
iEnumerable de esa clase.
Pero te pregunto, con ese set devuelto (iEnumerable<Cliente>) podria yo
usarlo igual a como uso un DataTable? Porque de no ser asi mejor usare el
metodo antiguo.

Carla Rincon


"Octavio Hernandez" escribió en el mensaje
news:uuUZIU%
Hola, Carla,

El parámetro de tipo que le pasas a ExecuteQuery no puede ser un
DataTable, ni tampoco un DataRow.

Si el DataTable no es tipado el problema no es trivial, porque la clase
DataRow no tiene constructures accesibles. Te recomendaría crearte una
clase con la estructura correspondiente a las tuplas que quieres
recuperar. Y luego te recomendaría
usar LINQ to DataSet (agregar referencia a System.Data.DataSetExtensions y
luego en el código hacer "using System.Data.DataSetExtensions;"). Ahí hay
un método extensor CopyToDataTable que sirve para "copiar" un
IEnumerable<DataRow> a un DataTable.

Te paso un ejemplo de cómo hacerlo. Utilizo nombres y fechas de nacimiento
de futbolistas en vez de código y nombre de clientes, pero en el fondo es
lo mismo. Bueno, y utilizo una consulta integrada "de verdad" en vez de
ExecuteQuery() ;-)

Saludos - Octavio

*******************************************
internal class MyDataTable : DataTable
{
internal MyDataTable()
: base()
{
Columns.Add("Nombre", typeof(string));
Columns.Add("FechaNacimiento", typeof(DateTime));
}

internal DataRow MakeDataRow(string nombre, DateTime dt)
{
DataRow dr = this.NewRow();
dr.BeginEdit();
dr[0] = nombre;
dr[1] = dt;
dr.EndEdit();
return dr;
}
}
private static void ExportarDataTable()
{
using (FutbolDataContext ctx = new FutbolDataContext())
{
ctx.Log = Console.Out;
MyDataTable dt = new MyDataTable();
dt.TableName = "Portugueses";
// consulta LINQ to SQL
var x = from f in ctx.Futbolista
where f.CodigoPaisNacimiento == "PT"
select dt.MakeDataRow(f.Nombre,
f.FechaNacimiento.Value);
// copiar datos a DataTable
x.CopyToDataTable(dt, LoadOption.OverwriteChanges);

// comprobación
foreach (DataRow dr in dt.Rows)
Console.WriteLine(dr[0]);
}
}
*******************************************



"Carla Rincon" <_> wrote in message
news:
Hola de nuevo.

Quiero saber si puedo hacer que el resultado de una llamada a
ExecuteQuery se entre a un DataTable?

Lo pongo asi:

var tab = DC.ExecuteQuery<System.Data.DataTable>(@"select codigo, nombre
from tabclientes");

//DC es el datacontext de linq.

Me compila bien pero al ejecutarlo me da error.


Carla Rincon






Respuesta Responder a este mensaje
#3 Octavio Hernandez
06/11/2007 - 23:09 | Informe spam
Hola, Carla!

Creo que mejor definire mi clase <Cliente> para que me devuelva un
iEnumerable de esa clase.



¿Te refieres a crear una clase especializada q solo tenga el código y el
nombre,
como hacía yo en el ejemplo, o a una que lo tenga todo (me imagino q los
clientes
tendrán más atributos que el código y el nombre)?

Si lo quieres una clase q lo tenga todo, ya tienes una: la clase Cliente que
genera
el asistente de LINQ to SQL. Luego en el DataContext tienes una propiedad
(también llamada Cliente o Clientes) que implementa IEnumerable<T> y sobre
la
que puedes hacer consultas. Por ejemplo

var clientes = from c in DC.Clientes select c; // todos los clientes a
"clientes"

Pero te pregunto, con ese set devuelto (iEnumerable<Cliente>) podria yo
usarlo igual a como uso un DataTable? Porque de no ser asi mejor usare el
metodo antiguo.



Depende a qué te refieres con "igual a como uso..." :-) Si es una aplicación
Windows Forms y quieres conectar eso a controles, pues creo q no. Tendrás q
usar el truco que te mostraba antes para pasar a un DataTable. Si es una
aplicación
Web, mira la clase LinqDataSource que sí te resolverá ese problema.

Slds - Octavio



Carla Rincon


"Octavio Hernandez" escribió en el mensaje
news:uuUZIU%
Hola, Carla,

El parámetro de tipo que le pasas a ExecuteQuery no puede ser un
DataTable, ni tampoco un DataRow.

Si el DataTable no es tipado el problema no es trivial, porque la clase
DataRow no tiene constructures accesibles. Te recomendaría crearte una
clase con la estructura correspondiente a las tuplas que quieres
recuperar. Y luego te recomendaría
usar LINQ to DataSet (agregar referencia a System.Data.DataSetExtensions
y luego en el código hacer "using System.Data.DataSetExtensions;"). Ahí
hay un método extensor CopyToDataTable que sirve para "copiar" un
IEnumerable<DataRow> a un DataTable.

Te paso un ejemplo de cómo hacerlo. Utilizo nombres y fechas de
nacimiento de futbolistas en vez de código y nombre de clientes, pero en
el fondo es lo mismo. Bueno, y utilizo una consulta integrada "de verdad"
en vez de ExecuteQuery() ;-)

Saludos - Octavio

*******************************************
internal class MyDataTable : DataTable
{
internal MyDataTable()
: base()
{
Columns.Add("Nombre", typeof(string));
Columns.Add("FechaNacimiento", typeof(DateTime));
}

internal DataRow MakeDataRow(string nombre, DateTime dt)
{
DataRow dr = this.NewRow();
dr.BeginEdit();
dr[0] = nombre;
dr[1] = dt;
dr.EndEdit();
return dr;
}
}
private static void ExportarDataTable()
{
using (FutbolDataContext ctx = new FutbolDataContext())
{
ctx.Log = Console.Out;
MyDataTable dt = new MyDataTable();
dt.TableName = "Portugueses";
// consulta LINQ to SQL
var x = from f in ctx.Futbolista
where f.CodigoPaisNacimiento == "PT"
select dt.MakeDataRow(f.Nombre,
f.FechaNacimiento.Value);
// copiar datos a DataTable
x.CopyToDataTable(dt, LoadOption.OverwriteChanges);

// comprobación
foreach (DataRow dr in dt.Rows)
Console.WriteLine(dr[0]);
}
}
*******************************************



"Carla Rincon" <_> wrote in message
news:
Hola de nuevo.

Quiero saber si puedo hacer que el resultado de una llamada a
ExecuteQuery se entre a un DataTable?

Lo pongo asi:

var tab = DC.ExecuteQuery<System.Data.DataTable>(@"select codigo, nombre
from tabclientes");

//DC es el datacontext de linq.

Me compila bien pero al ejecutarlo me da error.


Carla Rincon










Respuesta Responder a este mensaje
#4 principiante
06/11/2007 - 23:22 | Informe spam
Solo como nota al margen pues no estoy seguro si le sirve de algo, pero el
namespace de LinQ creo que tiene tambien un tipo distinto llamado 'Table'.


Jose TH


"Octavio Hernandez" escribió en el mensaje
news:
Hola, Carla!

Creo que mejor definire mi clase <Cliente> para que me devuelva un
iEnumerable de esa clase.



¿Te refieres a crear una clase especializada q solo tenga el código y el
nombre,
como hacía yo en el ejemplo, o a una que lo tenga todo (me imagino q los
clientes
tendrán más atributos que el código y el nombre)?

Si lo quieres una clase q lo tenga todo, ya tienes una: la clase Cliente
que genera
el asistente de LINQ to SQL. Luego en el DataContext tienes una propiedad
(también llamada Cliente o Clientes) que implementa IEnumerable<T> y sobre
la
que puedes hacer consultas. Por ejemplo

var clientes = from c in DC.Clientes select c; // todos los clientes a
"clientes"

Pero te pregunto, con ese set devuelto (iEnumerable<Cliente>) podria yo
usarlo igual a como uso un DataTable? Porque de no ser asi mejor usare el
metodo antiguo.



Depende a qué te refieres con "igual a como uso..." :-) Si es una
aplicación
Windows Forms y quieres conectar eso a controles, pues creo q no. Tendrás
q
usar el truco que te mostraba antes para pasar a un DataTable. Si es una
aplicación
Web, mira la clase LinqDataSource que sí te resolverá ese problema.

Slds - Octavio



Carla Rincon


"Octavio Hernandez" escribió en el
mensaje news:uuUZIU%
Hola, Carla,

El parámetro de tipo que le pasas a ExecuteQuery no puede ser un
DataTable, ni tampoco un DataRow.

Si el DataTable no es tipado el problema no es trivial, porque la clase
DataRow no tiene constructures accesibles. Te recomendaría crearte una
clase con la estructura correspondiente a las tuplas que quieres
recuperar. Y luego te recomendaría
usar LINQ to DataSet (agregar referencia a System.Data.DataSetExtensions
y luego en el código hacer "using System.Data.DataSetExtensions;"). Ahí
hay un método extensor CopyToDataTable que sirve para "copiar" un
IEnumerable<DataRow> a un DataTable.

Te paso un ejemplo de cómo hacerlo. Utilizo nombres y fechas de
nacimiento de futbolistas en vez de código y nombre de clientes, pero en
el fondo es lo mismo. Bueno, y utilizo una consulta integrada "de
verdad" en vez de ExecuteQuery() ;-)

Saludos - Octavio

*******************************************
internal class MyDataTable : DataTable
{
internal MyDataTable()
: base()
{
Columns.Add("Nombre", typeof(string));
Columns.Add("FechaNacimiento", typeof(DateTime));
}

internal DataRow MakeDataRow(string nombre, DateTime dt)
{
DataRow dr = this.NewRow();
dr.BeginEdit();
dr[0] = nombre;
dr[1] = dt;
dr.EndEdit();
return dr;
}
}
private static void ExportarDataTable()
{
using (FutbolDataContext ctx = new FutbolDataContext())
{
ctx.Log = Console.Out;
MyDataTable dt = new MyDataTable();
dt.TableName = "Portugueses";
// consulta LINQ to SQL
var x = from f in ctx.Futbolista
where f.CodigoPaisNacimiento == "PT"
select dt.MakeDataRow(f.Nombre,
f.FechaNacimiento.Value);
// copiar datos a DataTable
x.CopyToDataTable(dt, LoadOption.OverwriteChanges);

// comprobación
foreach (DataRow dr in dt.Rows)
Console.WriteLine(dr[0]);
}
}
*******************************************



"Carla Rincon" <_> wrote in message
news:
Hola de nuevo.

Quiero saber si puedo hacer que el resultado de una llamada a
ExecuteQuery se entre a un DataTable?

Lo pongo asi:

var tab = DC.ExecuteQuery<System.Data.DataTable>(@"select codigo,
nombre from tabclientes");

//DC es el datacontext de linq.

Me compila bien pero al ejecutarlo me da error.


Carla Rincon













Respuesta Responder a este mensaje
#5 Octavio Hernandez
06/11/2007 - 23:41 | Informe spam
Efectivamente Jose, la propiedad del DataContext que genera el asistente es
de tipo Table<T>,
por ejemplo:

public System.Data.Linq.Table<Cliente> Clientes
{
get { ... }
}

Slds - Octavio


"principiante" wrote in message
news:%
Solo como nota al margen pues no estoy seguro si le sirve de algo, pero el
namespace de LinQ creo que tiene tambien un tipo distinto llamado 'Table'.


Jose TH


"Octavio Hernandez" escribió en el mensaje
news:
Hola, Carla!

Creo que mejor definire mi clase <Cliente> para que me devuelva un
iEnumerable de esa clase.



¿Te refieres a crear una clase especializada q solo tenga el código y el
nombre,
como hacía yo en el ejemplo, o a una que lo tenga todo (me imagino q los
clientes
tendrán más atributos que el código y el nombre)?

Si lo quieres una clase q lo tenga todo, ya tienes una: la clase Cliente
que genera
el asistente de LINQ to SQL. Luego en el DataContext tienes una propiedad
(también llamada Cliente o Clientes) que implementa IEnumerable<T> y
sobre la
que puedes hacer consultas. Por ejemplo

var clientes = from c in DC.Clientes select c; // todos los clientes a
"clientes"

Pero te pregunto, con ese set devuelto (iEnumerable<Cliente>) podria yo
usarlo igual a como uso un DataTable? Porque de no ser asi mejor usare
el metodo antiguo.



Depende a qué te refieres con "igual a como uso..." :-) Si es una
aplicación
Windows Forms y quieres conectar eso a controles, pues creo q no. Tendrás
q
usar el truco que te mostraba antes para pasar a un DataTable. Si es una
aplicación
Web, mira la clase LinqDataSource que sí te resolverá ese problema.

Slds - Octavio



Carla Rincon


"Octavio Hernandez" escribió en el
mensaje news:uuUZIU%
Hola, Carla,

El parámetro de tipo que le pasas a ExecuteQuery no puede ser un
DataTable, ni tampoco un DataRow.

Si el DataTable no es tipado el problema no es trivial, porque la clase
DataRow no tiene constructures accesibles. Te recomendaría crearte una
clase con la estructura correspondiente a las tuplas que quieres
recuperar. Y luego te recomendaría
usar LINQ to DataSet (agregar referencia a
System.Data.DataSetExtensions y luego en el código hacer "using
System.Data.DataSetExtensions;"). Ahí hay un método extensor
CopyToDataTable que sirve para "copiar" un IEnumerable<DataRow> a un
DataTable.

Te paso un ejemplo de cómo hacerlo. Utilizo nombres y fechas de
nacimiento de futbolistas en vez de código y nombre de clientes, pero
en el fondo es lo mismo. Bueno, y utilizo una consulta integrada "de
verdad" en vez de ExecuteQuery() ;-)

Saludos - Octavio

*******************************************
internal class MyDataTable : DataTable
{
internal MyDataTable()
: base()
{
Columns.Add("Nombre", typeof(string));
Columns.Add("FechaNacimiento", typeof(DateTime));
}

internal DataRow MakeDataRow(string nombre, DateTime dt)
{
DataRow dr = this.NewRow();
dr.BeginEdit();
dr[0] = nombre;
dr[1] = dt;
dr.EndEdit();
return dr;
}
}
private static void ExportarDataTable()
{
using (FutbolDataContext ctx = new FutbolDataContext())
{
ctx.Log = Console.Out;
MyDataTable dt = new MyDataTable();
dt.TableName = "Portugueses";
// consulta LINQ to SQL
var x = from f in ctx.Futbolista
where f.CodigoPaisNacimiento == "PT"
select dt.MakeDataRow(f.Nombre,
f.FechaNacimiento.Value);
// copiar datos a DataTable
x.CopyToDataTable(dt, LoadOption.OverwriteChanges);

// comprobación
foreach (DataRow dr in dt.Rows)
Console.WriteLine(dr[0]);
}
}
*******************************************



"Carla Rincon" <_> wrote in message
news:
Hola de nuevo.

Quiero saber si puedo hacer que el resultado de una llamada a
ExecuteQuery se entre a un DataTable?

Lo pongo asi:

var tab = DC.ExecuteQuery<System.Data.DataTable>(@"select codigo,
nombre from tabclientes");

//DC es el datacontext de linq.

Me compila bien pero al ejecutarlo me da error.


Carla Rincon

















Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida