2008-09-10 15 views
12

tengo una consulta LINQ que quiero llamar desde múltiples lugares:¿Cómo puedo devolver un tipo anónimo desde un método?

var myData = from a in db.MyTable 
      where a.MyValue == "A" 
      select new { 
          a.Key, 
          a.MyValue 
          }; 

Cómo puedo crear un método, poner este código en él, y luego lo llaman?

public ??? GetSomeData() 
{ 
    // my Linq query 
} 
+0

¿Por qué no volver dicción ? –

+1

esto fue solo un simple ejemplo. Tengo muchos más valores que selecciono que no encajan en un diccionario – ScottG

+0

posible duplicado de [¿Devolver el tipo anónimo?] (Http://stackoverflow.com/questions/534690/return-anonymous-type) – nawfal

Respuesta

9

Tanto IQueryable como IEnumerable funcionan. Pero desea utilizar una versión específica de tipo, IQueryable < T > o IEnumerable < T >.

Por lo tanto, querrá crear un tipo para guardar los datos.

var myData = from a in db.MyTable 
      where a.MyValue == "A" 
      select new MyType 
      { 
       Key = a.Key, 
       Value = a.MyValue 
      }; 
+0

MUCHAS GRACIAS por expandir esta solución. La clave estaba usando un tipo específico. Esto funciona genial – ScottG

+0

Oye, di esa respuesta 1 hora antes de Darren. Me sirve para no dar una muestra :) –

+0

Para ser claro, lo que está sucediendo es que select new {...} crea un tipo anónimo (que requiere el uso de la palabra clave var). Este tipo no tiene nombre y solo se puede usar localmente en el método que lo creó (a menos que use el reflejo). Para usarlo afuera, necesita crear un tipo con nombre. – Lucas

7

IQueryable

Así que su declaración de método se vería como

public IQueryable GetSomeData() 
+0

¡Gracias! Eso ayuda tremendamente/ – ScottG

+2

Al hacer esto, no tendrá intellisense y solo podrá acceder a las propiedades de los elementos a través de la reflexión. –

+1

Tenga en cuenta que la consulta aún no se está ejecutando. –

2

Si desea volver, necesita un tipo.

En lugar de var, declare usando IEnumerable<> y devuelva esa variable. Iterar a través de él realmente ejecuta la consulta.

3

Un método genérico debe darle intelisense:

public class MyType {Key{get;set;} Value{get;set}} 

public IQueryable<T> GetSomeData<T>() where T : MyType, new() 
{ return from a in db.MyTable 
      where a.MyValue == "A" 
      select new T {Key=a.Key,Value=a.MyValue}; 
} 
Cuestiones relacionadas