EF Core/SQL Unir una entidad diferente según una condición.
Supongamos que tengo una tabla llamada Transacciones
Transacciones tiene las siguientes columnas:
OrderId,
OrderType (puede ser 0 = Venta o 1 = Compra),
Amount
Ahora quiero obtener los datos relevantes basados en el OrderType. Si OrderType = 0, entonces unir con Sale Table, de lo contrario unir con Purchase Table.
Actualmente, lo que estoy haciendo es hacer tres llamadas a la base de datos para obtener algunos otros valores de otras tablas (lo cual funciona, pero es altamente ineficiente a largo plazo, ya que 3 llamadas son malas en cuanto a rendimiento).
Mi solución es usar un join con SQL izquierdo.
SELECT ap.*, coalesce(s.orderNo,p.orderNo) as orderNo
FROM apptransactions AS ap
LEFT JOIN sales AS s ON (ap.orderType = 0 and ap.orderId = s.id)
LEFT JOIN purchases AS p ON (ap.orderType = 1 and ap.orderId = p.id);
¿Cómo se puede convertir esta consulta a EF Core?
davy.ai
Para convertir la consulta SQL a EF Core puedes usar LINQ to Entities. Aquí tienes un ejemplo:
Suponiendo que tienes modelos para Transacciones, Ventas y Compras:
Entonces, en tu DbContext, tendrías:
Y puedes usar LINQ to Entities para escribir una consulta que une la tabla Transactions con la tabla Sales o Purchases según el OrderType:
Esta consulta LINQ generará SQL similar a la consulta SQL que proporcionaste, usando left joins para unir la tabla Transactions con la tabla Sales o Purchases según el OrderType. La función coalesce se reemplaza con un operador ternario que verifica el OrderType para determinar qué OrderNo usar.