Próbuję utworzyć dostawcę LINQ. Korzystam z przewodnika LINQ: Building an IQueryable provider series i dodałem kod do LINQ: Budowanie dostawcy IQueryable - Część IV.W jaki sposób wyrażenie LINQ wie, że Where() występuje przed Select()?
Czuję, jak działa i jaki jest pomysł. Teraz utknąłem na problemie, który nie jest problemem z kodem, ale bardziej na zrozumieniu.
mam wystrzelenie to stwierdzenie:
QueryProvider provider = new DbQueryProvider();
Query<Customer> customers = new Query<Customer>(provider);
int i = 3;
var newLinqCustomer = customers.Select(c => new { c.Id, c.Name}).Where(p => p.Id == 2 | p.Id == i).ToList();
jakoś kodu lub ekspresyjny, wie, że Where
przychodzi przed Select
. Ale jak i gdzie?
W kodzie, który sortuje wyrażenie, nie ma sposobu, w rzeczywistości ToString()
w trybie debugowania, pokazuje, że Select jest przed Where
.
Próbowałem sprawić, by kod zawiódł. Normalnie zrobiłem najpierw Where
, a następnie Select
.
W jaki sposób wyrażenie to sortuje? Nie zrobiłem żadnej zmiany w kodzie w przewodniku.
Co masz na myśli "gdzie jest przed wyborem"? Masz na myśli wygenerowany kod SQL? – svick
Jedyne, co mogę myśleć to to, że może widzisz wygenerowany SQL ma SELECT i WHERE ponownie? W takim przypadku przypuszczam, że jest jakiś krok optymalizacji gdzieś w dostawcy Linq2Sql, który pobiera "SELECT Id, Name FROM" (SELECT Id, Name FROM Customer WHERE Id = 2 || Id = @ i) 'i konwertuje go na' SELECT Id, nazwa od klienta WHERE Id = 2 || Id = @ i' - ale czy to właśnie widzisz i czy o to pytasz? – Stuart
Znasz [re-linq] (http://relinq.codeplex.com/), prawda? Nie zamierzam wymyślać koła, mam nadzieję :-) – xanatos