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 № 1Per la traduzione della query SQL in LINQ:
- Tradurre
FROM
sottoselezioni come variabili dichiarate separatamente. - Traduci ogni clausola nell'ordine della clausola LINQ, lasciando gli operatori monadici (DISTINCT, TOP, ecc.) Come funzioni applicate all'intera query LINQ.
- Utilizza gli alias di tabella come variabili di intervallo. Utilizza gli alias di colonna come nomi di campi di tipo anonimo.
- Utilizza i tipi anonimi (nuovo {}) per più colonne
- L'unione sinistra viene simulata utilizzando una variabile join_variable e ne fa un'altra dalla variabile join seguita da .DefaultIfEmpty ().
- Sostituire COALESCE con l'operatore condizionale e un test Null.
- SELECT * deve essere sostituito con select range_variable o per joins, un oggetto anonimo che contiene tutte le variabili di intervallo.
- I campi SELECT devono essere sostituiti con select new {...} creando un oggetto anonimo con tutti i campi o le espressioni desiderati.
- 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
});