/ / SQL interno seleccione LINQ - c #, sql, .net, linq, datagrid

Selección interna de SQL a LINQ - c #, sql, .net, linq, datagrid

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 № 1

Para traducir la comprensión de consultas de SQL a LINQ:

  1. Traducir FROM subselecciona como variables declaradas por separado.
  2. 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.
  3. Usar alias de tablas como variables de rango. Utilice alias de columna como nombres de campo de tipo anónimo.
  4. Utilice tipos anónimos (nuevo {}) para varias columnas
  5. La combinación izquierda se simula utilizando una variable en join_variable y haciendo otra desde la variable join seguida de .DefaultIfEmpty ().
  6. Reemplace COALESCE con el operador condicional y una prueba nula.
  7. SELECT * debe reemplazarse con select range_variable o para uniones, un objeto anónimo que contiene todas las variables de rango.
  8. Los campos SELECT deben reemplazarse por seleccionar nuevo {...} creando un objeto anónimo con todos los campos o expresiones deseados.
  9. 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
});