sintaxis español ejemplos consultas comandos avanzadas c# linq dto-mapping

español - select linq to sql c#



Separación de preocupaciones con Linq To SQL y DTO''s (2)

En mi opinión, en la mayoría de los casos, los objetos DTO no son necesarios cuando se trata de LINQ. Las clases LINQ generadas se pueden probar fácilmente. LINQ le da la capacidad de consultar sus datos desde diferentes fuentes utilizando consultas idénticas. Le da la capacidad de probar sus consultas contra listas de objetos en lugar de db real.

Recientemente comencé un nuevo proyecto de formularios web y decidí separar las clases de negocios de cualquier referencia de DBML. Mis clases de capas de negocios en cambio acceden a métodos de capa de datos discretos y son colecciones devueltas de DTO. Entonces, la capa de datos podría proyectar DTO de la siguiente manera:

(from c in dataContext.Customers where c.Active == true select new DTO.Customer { CustomerID = c.CustomerID, Name = c.CustomerName, ... }).ToList()

A pesar de que la creación de los objetos DTO agrega trabajo, este parece ser un mejor enfoque para un enlace estrecho entre las capas Business & Data y significa que puedo probar la capa Business sin que esté presente una base de datos.

Mi pregunta es, ¿es esta una buena práctica ?, ¿hay alguna manera de generar los DTO (tal vez a través de SQLMetal) y qué otros problemas podría tener cuando avance el proyecto?


No sé si es la mejor práctica, pero escribí un código similar en un pasado no tan reciente porque también sentí que podía mejorar la separación de las preocupaciones utilizando mis propias clases en lugar de las creadas por el diseñador de LINQ dentro de mi aplicación .

Es posible que desee considerar la posibilidad de devolver un IQueryable <Cliente> en lugar de un IList <Cliente> de su método de acceso a datos. Como IQueryable <T> hereda de IEnumerable <T>, el resto de tu aplicación debería poder manejarlo bastante bien. También puede convertirlo en una lista cuando realmente lo necesite.

La ventaja de esto es que puede modificar dinámicamente su consulta con bastante facilidad y minimizar la cantidad de datos devueltos por SQL Server.

Por ejemplo, si la firma de su método es IQueryable <Cliente> GetCustomers (), puede obtener un solo cliente llamando a GetCustomers (). Where (c => c.CustomerID == 101) .Single ();

En este ejemplo, solo se devolverá un registro de la base de datos, mientras que imagino que actualmente su código devolvería a todos los clientes o se requeriría que escriba métodos separados (y por lo tanto un código muy repetitivo) para atender todas las diferentes cosas que desee. para filtrar por.