Pasar como parametro un var de Linq

11/12/2008 - 15:39 por Paul | Informe spam
Hola,

En el load de un formulario hago por ejemplo:
var clienteVehiculo;= from cli in dc.clientes
join coche in dc.vehiculos
on cli.id==coche.idCli
select new
{
idCliente=cli.id,
idVehiculo=coche.id,
nombreVliente=cli.nombre,
matricula=coche.matricula
};

Y esto quiero que sea visible para varios metodos del formulario.
Como puedo pasar clienteVehiculo como parametro a otras funciones?
En estas funciones se podra hacer paramClienteVehiculo.nombre?

Gracias

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
11/12/2008 - 15:48 | Informe spam
"Paul" wrote in message
news:
En el load de un formulario hago por ejemplo:
var clienteVehiculo;= from cli in dc.clientes
join coche in dc.vehiculos
on cli.id==coche.idCli
select new
{
idCliente=cli.id,
idVehiculo=coche.id,
nombreVliente=cli.nombre,
matricula=coche.matricula
};

Y esto quiero que sea visible para varios metodos del formulario.
Como puedo pasar clienteVehiculo como parametro a otras funciones?
En estas funciones se podra hacer paramClienteVehiculo.nombre?




No, no se puede. Es una limitación de C# 3.0: Los var no se reconocen
fuera del ámbito que los declara e inicializa. En C# 4.0 (que aún es
preliminar y la especificación no es definitiva) probablemente estarán
disponibles los tipos "dynamic" que sí que permitirán hacer estas cosas,
pero en el 3.0 no se puede. Tendrías que usar en el select un tipo concreto
en lugar de un tipo anónimo, y asignar los resultados de la consulta a una
lista de ese tipo concreto. Entonces sí que podrías devolver la lista fuera
del método.
Respuesta Responder a este mensaje
#2 Paul
12/12/2008 - 10:18 | Informe spam
On 11 dic, 15:48, "Alberto Poblacion" <earthling-
wrote:
"Paul" wrote in message

news:

> En el load de un formulario hago por ejemplo:
> var clienteVehiculo;= from cli in dc.clientes
> join coche in dc.vehiculos
> on cli.id==coche.idCli
> select new
> {
> idCliente=cli.id,
> idVehiculo=coche.id,
> nombreVliente=cli.nombre,
> matricula=coche.matricula
> };

> Y esto quiero que sea visible para varios metodos del formulario.
> Como puedo pasar clienteVehiculo como parametro a otras funciones?
> En estas funciones se podra hacer paramClienteVehiculo.nombre?

    No, no se puede. Es una limitación de C# 3.0: Los var no se reconocen
fuera del ámbito que los declara e inicializa. En C# 4.0 (que aún es
preliminar y la especificación no es definitiva) probablemente estarán
disponibles los tipos "dynamic" que sí que permitirán hacer estas cosas,
pero en el 3.0 no se puede. Tendrías que usar en el select un tipo concreto
en lugar de un tipo anónimo, y asignar los resultados de la consulta a una
lista de ese tipo concreto. Entonces sí que podrías devolver la lista fuera
del método.



Hola,
No entiendo muy bien lo que dices, me podrias poner un ejemplo?

Gracias
Respuesta Responder a este mensaje
#3 Alberto Poblacion
12/12/2008 - 12:28 | Informe spam
"Paul" wrote in message
news:
[...] Tendrías que usar en el select un tipo concreto
en lugar de un tipo anónimo, y asignar los resultados de la consulta a
una
lista de ese tipo concreto. Entonces sí que podrías devolver la lista
fuera
del método.



Hola,
No entiendo muy bien lo que dices, me podrias poner un ejemplo?



Lo de que "estás devolviendo un tipo anónimo" se refiere a que estás
haciendo "select new {...};". Esto genera internamente una Clase privada con
un nombre aleatorio decidido por el compilador, que no es accesible por tí
de forma explícita en ningún sitio. Por eso los elementos generados los
tienes que asignar a un "var", que recibe el tipo de Clase correspondiente
directamente desde el compilador. Y por eso no se puede devolver el "var" a
fuera del método, ya que la Clase representada por ese "var" no existe en
ningún otro sitio.

El remedio es crear tú mismo la Clase, para que sea conocida:

Class MisDatos
{
public int idCliente {get;set;}
public int idVehiculo {get;set;}
public string nombreVliente {get;set;}
public string matricula {get;set;}
}

Y ahora cambias el select de forma que haga un "new" de esta clase:

... select new MisDatos { idCliente=cli.id, etc.etc };

Con el resultado haces un .ToList() y se lo asignas a un List<MisDatos> en
lugar de un var. Y ahora, ese List<MisDatos> sí que lo puedes devolver fuera
del procedimiento, a cualquier sitio que tenga visibilidad del Class
MisDatos (lo puedes marcar como public o internal según convenga).
Respuesta Responder a este mensaje
#4 Paul
12/12/2008 - 13:51 | Informe spam
On 12 dic, 12:28, "Alberto Poblacion" <earthling-
wrote:
"Paul" wrote in message

news:

>> [...] Tendrías que usar en el select un tipo concreto
>> en lugar de un tipo anónimo, y asignar los resultados de la consulta a
>> una
>> lista de ese tipo concreto. Entonces sí que podrías devolver la lista
>> fuera
>> del método.

> Hola,
> No entiendo muy bien lo que dices, me podrias poner un ejemplo?

Lo de que "estás devolviendo un tipo anónimo" se refiere a que estás
haciendo "select new {...};". Esto genera internamente una Clase privada con
un nombre aleatorio decidido por el compilador, que no es accesible por tí
de forma explícita en ningún sitio. Por eso los elementos generados los
tienes que asignar a un "var", que recibe el tipo de Clase correspondiente
directamente desde el compilador. Y por eso no se puede devolver el "var" a
fuera del método, ya que la Clase representada por ese "var" no existe en
ningún otro sitio.

El remedio es crear tú mismo la Clase, para que sea conocida:

Class MisDatos
{
public int idCliente {get;set;}
public int idVehiculo {get;set;}
public string nombreVliente {get;set;}
public string matricula {get;set;}

}

Y ahora cambias el select de forma que haga un "new" de esta clase:

... select new MisDatos { idCliente=cli.id, etc.etc };

Con el resultado haces un .ToList() y se lo asignas a un List<MisDatos> en
lugar de un var. Y ahora, ese List<MisDatos> sí que lo puedes devolver fuera
del procedimiento, a cualquier sitio que tenga visibilidad del Class
MisDatos (lo puedes marcar como public o internal según convenga).



Perfecto, muchas gracias
Respuesta Responder a este mensaje
#5 Julian
17/12/2008 - 14:49 | Informe spam
Yo defino dentro de la clase del formulario y fuera do cualquier metodo
private IQueryable<veiculos> clienteVehiculo;

y luego dentro del Evento Load del Form
clienteVehiculo = from cli in dc.clientes join coche in dc.vehiculos on
cli.id == coche.edCli delect etc.

luego dispondrás de la colecion clienteVehiculo en cualquier Metodo.
Lo que no te garantizo que funcione es "select new {etc, etc, etc}
al menos eso me pasa con BindingList en lugar de IQueryable.

"Paul" escribió en el mensaje
news:
Hola,

En el load de un formulario hago por ejemplo:
var clienteVehiculo;= from cli in dc.clientes
join coche in dc.vehiculos
on cli.id==coche.idCli
select new
{
idCliente=cli.id,
idVehiculo=coche.id,
nombreVliente=cli.nombre,
matricula=coche.matricula
};

Y esto quiero que sea visible para varios metodos del formulario.
Como puedo pasar clienteVehiculo como parametro a otras funciones?
En estas funciones se podra hacer paramClienteVehiculo.nombre?

Gracias
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida