2011-02-16 16 views
12

Tengo dos tablas A & B. Puedo disparar las consultas de Linq & obtener datos necesarios para tablas individuales. Como sé lo que devolverá cada una de las tablas, como se muestra en el ejemplo. Pero, cuando me uno a ambas tablas, no estoy al tanto del tipo de devolución de la consulta Linq. Este problema se puede resolver creando una clase que contenga las propiedades de ID, Nombre y Dirección dentro de este. pero, cada vez que antes de escribir una consulta de combinación en función del tipo de retorno que tendrá que crear una clase que no es una forma conveniente ¿Hay alguna otra mathod disponibles para lograr este¿Cuál es el tipo de devolución de mi consulta linq?

private IList<A> GetA() 
    { 
     var query = from a in objA 
        select a; 
     return query.ToList(); 
    } 

    private IList<B> GetB() 
    { 
     var query = from b in objB 
        select b; 
     return query.ToList(); 
    } 

    private IList<**returnType**?> GetJoinAAndB() 
    { 
     var query = from a in objA 
        join b in objB 
        on a.ID equals b.AID 
        select new { a.ID, a.Name, b.Address }; 
     return query.ToList(); 
    } 
+1

http://stackoverflow.com/questions/534690/linq-to-sql-return-anonymous-type – Jordan

Respuesta

1

El valor se genera se llama tipo anónimo y puede volver a menos que regreses object como:

private object GetJoinAAndB() 
{ 
    var query = from a in objA 
       join b in objB 
       on a.ID equals b.AID 
       select new { a.ID, a.Name, b.Address }; 
    return query.ToList(); 
} 

Hay dos buenas soluciones: 1.
se puede generar una clase para que coincida con la salida y generarlo como solución Kobi
2. Si está utilizando .NET 4 se puede devolver un tipo dynamic como

private dynamic GetJoinAAndB() 
{ 
    var query = from a in objA 
       join b in objB 
       on a.ID equals b.AID 
       select new { a.ID, a.Name, b.Address }; 
    return query.ToList(); 
} 

entonces usted puede Úselo más tarde. Puede buscar en Internet la ventaja de utilizar la palabra clave dynamic.

+3

'dynamic' está destinado a ser utilizado con objetos COM, no como sustituto del diseño correcto. Hará que el desarrollo sea muy difícil: perderá intellisense, y todos los errores de compilación se convertirán en ** errores de tiempo de ejecución **. 'object' es solo un poco mejor, ya que estás limitado a errores de tiempo de ejecución de casting no válidos. Por lo menos, prueba mucho. – Kobi

+0

Sí, lo sé, tienes toda la razón, pero a veces, aunque estoy en contra de esto, debes utilizarlo para satisfacer tus necesidades. –

14

Usted ha creado una clase anónima - Realmente no puedes devolverlo. Una solución simple es agregar una clase para representar su tipo.

Por ejemplo:

public class UserWithAddress 
{ 
    public UserWithAddress(int id, string name, string address) 
    { 
     ID = id; 
     Name = name; 
     Address = address; 
    } 

    // you may have your own types here 
    public int ID { get; set; } 
    public String Name { get; set; } 
    public String Address { get; set; } 
} 

Y luego:

private IList<UserWithAddress> GetJoinAAndB() 
{ 
    var query = from a in objA 
       join b in objB 
       on a.ID equals b.AID 
       select new UserWithAddress(a.ID, a.Name, b.Address); 
    return query.ToList(); 
} 
2

A medida que han creado un anónimo (Los tipos anónimos son generados por el compilador, por lo que no pueden saber el nombre del tipo en nuestros códigos) clase para que no pueda devolverlo. Cree una clase separada con tres propiedades Id, Nombre y Dirección y luego devuélvala.

public class Contact 
     { 
      public int Id { get; set; } 
      public string Name { get; set; } 
      public string Address { get; set; } 

     } 

private IList<Contact> GetJoinAAndB() 
    { 
     var query = from a in objA 
        join b in objB 
        on a.ID equals b.AID 
        select new Contact{ a.ID, a.Name, b.Address }; 
     return query.ToList(); 
    } 
3

Me gusta Kobi dijo.

Si no desea crear una clase específicamente para este caso, puede usar un Tuple. Sin embargo, solo es compatible con .Net 4.

Cuestiones relacionadas