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

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

Questo cosa mi sta facendo impazzire

Penso che non sia così complicato ma non capisco.

Ho questa istruzione SQL funzionante e ho bisogno dell'istruzione Linq per questo.

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;

Per spiegazione:

Ho un tavolo con articoli e un tavolo b con una cronologia dei prezzi.

Ora ho bisogno di un datagrid dove posso inserire nuove voci per la tabella a (quindi una vista non funziona) e dopo averle salvate mostrandomi il prezzo associato

Spero di potermi esprimere in modo comprensibile

risposte:

3 per risposta № 1

Per la traduzione della query SQL in LINQ:

  1. Tradurre FROM sottoselezioni come variabili dichiarate separatamente.
  2. Traduci ogni clausola nell'ordine della clausola LINQ, lasciando gli operatori monadici (DISTINCT, TOP, ecc.) Come funzioni applicate all'intera query LINQ.
  3. Utilizza gli alias di tabella come variabili di intervallo. Utilizza gli alias di colonna come nomi di campi di tipo anonimo.
  4. Utilizza i tipi anonimi (nuovo {}) per più colonne
  5. L'unione sinistra viene simulata utilizzando una variabile join_variable e ne fa un'altra dalla variabile join seguita da .DefaultIfEmpty ().
  6. Sostituire COALESCE con l'operatore condizionale e un test Null.
  7. SELECT * deve essere sostituito con select range_variable o per joins, un oggetto anonimo che contiene tutte le variabili di intervallo.
  8. I campi SELECT devono essere sostituiti con select new {...} creando un oggetto anonimo con tutti i campi o le espressioni desiderati.
  9. corretto FULL OUTER JOIN deve essere gestito con un metodo di estensione.

Per la tua richiesta:

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 per risposta № 2

Non sono sicuro di quale sintassi si sta puntando, ma uno di questi dovrebbe fare il trucco. Non l'ho provato però.

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
});