2011-07-26 15 views
5

Tengo un servicio web WCF/REST que estoy considerando utilizar Linq en SQL para devolver información de la base de datos.Devolver conjuntos de datos de LINQ a SQL en un servicio REST/WCF

Es bastante fácil de hacer consultas básicas contra las tablas y filas volver, por ejemplo:

[WebGet(UriTemplate = "")] 
    public List<User> GetUsers() 
    { 
     List<User> ret = new List<User>(); ; 
     using (MyDataContext context = new MyDataContext()) 
     { 
      var userResults = from u in context.Users select u; 
      ret = userResults.ToList<User>(); 
     } 

     return ret; 
    } 

Pero lo que si quiero devolver datos de varias tablas o que no coincide exactamente con el esquema de la tabla ? No puedo encontrar la manera de devolver los resultados de esta consulta, por ejemplo:

var userResults = from u in context.Users 
    select new { u.userID, u.userName, u.userType, 
       u.Person.personFirstname, u.Person.personLastname }; 

Obviamente el conjunto de filas resultante no se adhiere al esquema de "Usuario", así que no puedo acaba de convertir en una lista de objetos de usuario.

Intenté hacer una nueva entidad en mi modelo de objetos que estuviera relacionada con el conjunto de resultados, pero no desea hacer la conversión.

¿Qué me estoy perdiendo?

Editar: pregunta relacionada: ¿qué pasa con los resultados devueltos de los procedimientos almacenados? Mismo problema, ¿cuál es la mejor manera de empaquetarlos para que regresen a través del servicio?

Respuesta

4

Puede crear un Complex Type y, en lugar de devolver el objeto Anónimo, devuelve el Tipo complejo. Cuando mapea procedimientos almacenados usando importación de funciones, tiene la opción de crear automáticamente un tipo complejo.

Crear una clase personalizada con las propiedades que necesita:

public class MyTimesheet 
{ 
    public int Id { get; set; } 
    public string Data { get; set; } 
} 

A continuación, cree que de la consulta LINQ:

using (linkDataContext link = new linkDataContext()) 
{ 
    var data = (from t in link.TimesheetDetails 
       select new MyTimesheet 
       { 
        Id = t.Id, 
        Data = t.EmployeeId.ToString() 
       }).ToList(); 
} 
+0

Ese es el Entity Framework, no lineal Linq To SQL. Estoy tratando de evitar el uso de Entity Framework si es posible. – BDW

+0

Oh, ya veo. Puede crear una clase concreta en lugar de una anónima como sugirió m4tt1mus. –

+0

PERO ... digamos que sí uso Entity Framework. Sé cómo los tipos complejos funcionan con procs almacenados, eso no es un problema. ¿Cómo se correlaciona la consulta de linq a sql que tengo arriba con el tipo complejo? Nada de lo que intento está funcionando. – BDW

5

En términos generales, no debe devolver los objetos de dominio de un servicio porque si lo haces te encontrarás con problemas como los que estás encontrando. Los objetos de dominio están destinados a describir una entidad particular en el dominio del problema, y ​​con frecuencia no encajarán bien con la provisión de un conjunto particular de datos para devolver a partir de una llamada de servicio.

Lo mejor es desacoplar las entidades de su dominio del servicio creando data transfer objects para representarlas que contienen solo la información que necesita transferir. Los DTO tendrían constructores que tomarían objeto (s) de dominio y copiarían los valores de propiedad necesarios (también necesitarías un constructor sin parámetros para que puedan ser serializados), o puedes usar un mapeador objeto-objeto como AutoMapper. También tendrán funciones específicas del servicio como IExtensibleDataObject y DataMemberAttributes que no son apropiadas para objetos de dominio. Esto libera los objetos de tu dominio para variar independientemente de los objetos que envíes desde el servicio.

Cuestiones relacionadas