To rzecz doprowadza mnie do szału.
Myślę, że to nie jest takie skomplikowane, ale nie rozumiem.
Mam działającą instrukcję SQL i potrzebuję do niej instrukcji Linq.
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;
Dla wyjaśnienia:
Mam stół z artykułami i stół b z historią cen.
Teraz potrzebuję siatki danych, w której mogę wprowadzić nowe wpisy do tabeli a (więc widok nie działa) i po zapisaniu jego pokazuje mi powiązaną cenę
Mam nadzieję, że potrafię wyrazić się zrozumiale
Odpowiedzi:
3 dla odpowiedzi № 1Do tłumaczenia zapytania SQL na zrozumienie LINQ:
- Przetłumacz
FROM
podselektuje jako osobno zadeklarowane zmienne. - Przetłumacz każdą klauzulę w kolejności klauzul LINQ, pozostawiając operatory monadyczne (DISTINCT, TOP itp.) Jako funkcje zastosowane do całego zapytania LINQ.
- Użyj aliasów tabel jako zmiennych zakresu. Użyj aliasów kolumn jako nazw pól typu anonimowego.
- Użyj anonimowych typów (nowy {}) dla wielu kolumn
- Lewe łączenie jest symulowane przy użyciu zmiennej do Join_variable i wykonania innej ze zmiennej join, a następnie .DefaultIfEmpty ().
- Zamień COALESCE na operator warunkowy i test zerowy.
- WYBIERZ * musi zostać zastąpiony przez select zmienna zakresu lub dla złączeń anonimowy obiekt zawierający wszystkie zmienne zakresu.
- Pola SELECT należy zastąpić zaznaczeniem nowego {...} tworząc anonimowy obiekt ze wszystkimi pożądanymi polami lub wyrażeniami.
- Właściwy
FULL OUTER JOIN
należy obsługiwać za pomocą metody rozszerzenia.
Dla twojego zapytania:
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 dla odpowiedzi nr 2
Nie jestem pewien, do której składni dążysz, ale jedna z nich powinna wystarczyć. Nie przetestowałem tego jednak.
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
};
lub
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
});