Esta cosa me esta volviendo loco
Creo que no es tan complicado pero no lo entiendo.
Tengo esta declaración SQL de trabajo y necesito la instrucción Linq para ello.
select
a.id, a.date,
(select top 1 b.price from b where a.id = b.id and a.date >= b.date) as price
from a;
Para explicación:
Tengo una tabla a con artículos y una tabla b con un historial de precios.
Ahora necesito un datagrid donde puedo ingresar nuevas entradas para la tabla a (por lo que una vista no funciona) y luego de guardar su precio que muestra asociado
Espero poder expresarme comprensiblemente.
Respuestas
3 para la respuesta № 1Para traducir la comprensión de consultas de SQL a LINQ:
- Traducir
FROM
subselecciona como variables declaradas por separado. - Convierta cada cláusula en el orden de la cláusula LINQ, dejando a los operadores monádicos (DISTINCT, TOP, etc.) como funciones aplicadas a toda la consulta LINQ.
- Usar alias de tablas como variables de rango. Utilice alias de columna como nombres de campo de tipo anónimo.
- Utilice tipos anónimos (nuevo {}) para varias columnas
- La combinación izquierda se simula utilizando una variable en join_variable y haciendo otra desde la variable join seguida de .DefaultIfEmpty ().
- Reemplace COALESCE con el operador condicional y una prueba nula.
- SELECT * debe reemplazarse con select range_variable o para uniones, un objeto anónimo que contiene todas las variables de rango.
- Los campos SELECT deben reemplazarse por seleccionar nuevo {...} creando un objeto anónimo con todos los campos o expresiones deseados.
- Apropiado
FULL OUTER JOIN
Debe ser manejado con un método de extensión.
Para su consulta:
var ans = from ra in a
select new {
ra.id,
ra.date,
price = (from rb in b
where ra.id == rb.id && ra.date >= rb.date
select rb.price).First()
};
0 para la respuesta № 2
No estoy seguro de a qué sintaxis apunta, pero uno de estos debería hacer el truco. Aunque no lo he probado.
from xa in a
select new
{
id,
date,
price = (
from xb in b
where xa.id == xb.id && xa.date >= xb.date
select xb.price
).First() // or .FirstOrDefault() if you want to allow null prices
};
o
a.Select(xa => new
{
id,
date,
price = b.First(xb => xa.id == xb.id && xa.date >= xb.date) // or .FirstOrDefault() if you want to allow null prices
});