type method c# linq linq-to-sql anonymous-types

method - return dynamic object c#



Cómo devolver el tipo anónimo desde el método c#que usa LINQ to SQL (6)

Posible duplicado:
LINQ to SQL: ¿Devuelve el tipo anónimo?

Tengo una consulta LINQ to SQL estándar, que devuelve los datos como un tipo anónimo (que contiene aproximadamente 6 columnas de datos de varios tipos de datos).

Me gustaría hacer que este objeto devuelto esté disponible para otras partes del programa, devolviéndolo al llamador del método o asignándolo a una propiedad del objeto que contiene el método.

¿Cómo puedo hacer esto dado que es un tipo anónimo ("var")?

EDITAR - Aquí está el código:

using (ormDataContext context = new ormDataContext(connStr)) { var electionInfo = from t1 in context.elections join t2 in context.election_status on t1.statusID equals t2.statusID select new { t1, t2 }; }


Convertir el tipo anónimo en una clase ...

public class Person { public Person() { } public String Name { get; set; } public DateTime DOB { get; set; } } Person p = from person in db.People where person.Id = 1 select new Person { Name = person.Name, DOB = person.DateOfBirth }


Depende de cómo el código de llamada va a usar los datos.

Si está haciendo un enlace de datos simple, realmente no le importa el tipo (es decir, no tiene que acceder explícitamente a las propiedades en su código C #), puede volver a pasar los resultados como un IEnumberable.

En la mayoría de los casos de enlace de datos está llamando propiedades por nombre, a través de cadenas mágicas, de todos modos, por lo que el tipo exacto no importa de todos modos.

De lo contrario, debe convertir el tipo anónimo a un tipo con nombre.


El uso de var no lo convierte en un tipo anónimo. Usar var solo significa dejar que esta variable sea del tipo disponible en el lado derecho de la asignación. Es solo mano corta. Si la cosa en el lado derecho es una clase real, la variable será de ese tipo.

Por ejemplo:

var person = new Person { Name = "bob" };

La variable persona es de tipo Persona, aunque usó la palabra clave var.

Los tipos anónimos se crean con el nuevo {Name = ...}. En este caso, es una clase nueva y anónima. Lo único que puede asignar es una variable definida usando var (u objeto) ya que no hay un nombre existente para usar.

Por ejemplo:

var person = new { Name = "bob" };

En este caso, la persona es un tipo anónimo definido en tiempo de ejecución.

En general, como dice @Chalkey, si desea pasar el resultado a otro método, use un tipo con nombre, no uno anónimo.

Si se ve obligado a utilizar un tipo anónimo, tendrá que volver a pasarlo como un objeto de tipo Object y luego usar reflection para ver sus propiedades.


Jon Skeet escribió un blog sobre cómo hacer esto, que con bastante razón se titula Horribly Grotty Hack . Tal como lo sugiere el título, realmente no debería buscar formas de devolver un tipo anónimo. En su lugar, debe crear un tipo que pueda devolverse ya que esta es la forma correcta de implementar esta característica.

Por lo tanto, le recomiendo que cree una definición concreta del tipo que se devolverá y luego rellene eso en su consulta para que se devuelva.


No puede escribir ningún método en C # para que sea el tipo explícito de un tipo anónimo. No pueden ser "nombrados" por así decirlo y, por lo tanto, no pueden aparecer en las firmas de metadatos.

Si realmente desea devolver un valor que es de tipo anónimo, hay 2 opciones

  1. Haga que el tipo de devolución del método sea System.Object. A continuación, puede hacer mal los hack casting para obtener un valor tipeado en otro método. Esto es muy frágil y no lo recomiendo.
  2. Use un método genérico y un truco de inferencia de tipo para obtener el tipo de devolución correcto. Esto requeriría una definición de firma muy interesante para su enfoque.

Los tipos anónimos no estaban destinados a ser transmitidos de esta manera. En el momento en que necesite pasarlos entre sus funciones de esta manera, será mejor que defina explícitamente un tipo.


Si tiene que pasar los resultados en una aplicación grande, puede usar Dictionary. Sí, tienes algo de sobrecarga al lanzar, pero al menos estás reduciendo el riesgo de tirar objetos.