varias tablas relacionadas multitablas inner ejemplos consultas consultar consulta con anidadas performance linq-to-sql architecture repository-pattern

performance - relacionadas - inner join varias tablas



linq2sql, patrón de repositorio: ¿cómo consultar datos de dos o más tablas? (2)

var customers = from cust in CustomersRep join prod in ProductsRep on prod.CustomerID equals cust.CustomerID where prod.ProductName == yourInput select cust;

Puede escribir una consulta, similar a la que haría en SQL (esencialmente). En lo anterior, su yourInput es la variable que contiene el nombre del producto que le interesa.

Esto debería darle una única solicitud de consulta DB, siempre y cuando ProductsRep y CustomersRep estén en la misma base de datos.

Uso el patrón Repository (y linq2sql como acceso a datos) y tengo, por ejemplo, ProductsRep y CustomersRep.

En un escenario muy simple, db tiene dos tablas: Produsts (ProductID, CustomerID, ProductName, Date) y Customer (CustomerID, FirstName, LastName).

Cada repositorio proporciona métodos para crear, actualizar, eliminar y obtener un objeto modelo específico y, tal vez, algunos filtros.

Pero si quiero consultar a todos los clientes que compran productos específicos por nombre de producto, tengo que obtener ProductID de este producto usando ProductsRep y luego obtener CustomersRep para todos los clientes que compran productos con esta identificación.

¿Estoy en lo cierto? En realidad, se trata de dos solicitudes sql que debe generar l2s, ¿es posible hacer solo una solicitud?

Y, en general, si queremos consultar datos usando múltiples tablas con relaciones y patrones de repositorio, ¿cómo hacer esto reduciendo la cantidad de consultas al mínimo?

Gracias.


Piensa en la declaración que hiciste:

Pero si quiero consultar a todos los clientes que compran productos específicos por nombre de producto, tengo que obtener ProductID de este producto usando ProductsRep y luego obtener CustomersRep para todos los clientes que compran productos con esta identificación.

Eso huele problemas. Cree un repositorio para facilitar el comportamiento en un área aislada de su dominio, no para cada entidad comercial.

Un error común con DDD / Repository es pensar en los datos. NO. Piensa en el comportamiento.

Usted tiene una entidad de Productos que se refiere a un Cliente . Lo que significa que un Producto no puede existir sin un cliente. ¿Derecha? Por lo tanto, un cliente es su raíz de agregado: controla el comportamiento de esta parte de su modelo de dominio.

Su comentario a la respuesta anterior confirma que está trabajando en varios repositorios. Tienes dos opciones: 1) unidad de trabajo, 2) arregla el diseño de tu repositorio.

Solo necesita 1 repositorio, llamémoslo CustomerProductRepository .

Luego, para hacer su consulta anterior:

var customersWhoBuyHats = customerProductRepository .Products .Include("Customer") .Where(x => x.ProductName == "Hat") .Select(x => x.Customer) .ToList();

El resultado es una List<Customer> , y lo hizo con una llamada a la base de datos.

HTH.