/ / SQL wewnętrzny wybierz do LINQ - c #, sql, .net, linq, datagrid

SQL wewnętrzny wybierz LINQ - c #, sql, .net, linq, datagrid

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

Do tłumaczenia zapytania SQL na zrozumienie LINQ:

  1. Przetłumacz FROM podselektuje jako osobno zadeklarowane zmienne.
  2. 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.
  3. Użyj aliasów tabel jako zmiennych zakresu. Użyj aliasów kolumn jako nazw pól typu anonimowego.
  4. Użyj anonimowych typów (nowy {}) dla wielu kolumn
  5. Lewe łączenie jest symulowane przy użyciu zmiennej do Join_variable i wykonania innej ze zmiennej join, a następnie .DefaultIfEmpty ().
  6. Zamień COALESCE na operator warunkowy i test zerowy.
  7. WYBIERZ * musi zostać zastąpiony przez select zmienna zakresu lub dla złączeń anonimowy obiekt zawierający wszystkie zmienne zakresu.
  8. Pola SELECT należy zastąpić zaznaczeniem nowego {...} tworząc anonimowy obiekt ze wszystkimi pożądanymi polami lub wyrażeniami.
  9. 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
});