2009-10-27 26 views
9

Im przy użyciu PredicateBuilder, jak widać tutaj http://www.albahari.com/nutshell/predicatebuilder.aspx, wszystko działa świetnie, a teraz mogę generować dynamiczne LINQ do wyrażeń SQL, ale rzeczą, której nie rozumiem jest, dlaczego, gdy jestem w pętli w ten sposób:LINQ do SQL PredicateBuilder

var inner = PredicateBuilder.False<MyType>(); 
foreach (var f in Filtermodel.InstrumentsFilterList.Where(s => s.isActive)) 
     { 
      int temp = f.InstrumentID; 
      inner = inner.Or(ud => ud.InstrumentId == temp); 
     } 

Dlaczego muszę używać tej zmiennej temp ?, staram się korzystać z „f” zmiennej iteracyjnej, ale tylko dostać ostatnią wartość na liście dla każdej iteracji, jak to jest przekazywane przez referencję ...

Odpowiedz

10

Ponieważ PredicateBuilder buduje wyrażenie, które zostanie wykonane w późniejszym czasie. Kiedy kompilator generuje zamknięcie dla delegata, znajduje wszelkie wartości, które są tworzone w bieżącym zakresie i przenosi je również do zamknięcia. Ponieważ InstrumentID jest typem wartości (int), inicjowanie i kopiowanie wartości oznacza, że ​​każdy delegat/zamknięcie będzie mieć przy sobie tę wartość. Jeśli nie utworzysz kopii wartości za każdym razem, wyrażenie będzie po prostu miało literalne odwołanie do f.InstrumentID, a nie do jego wartości bazowej. Później, gdy wyrażenie zostanie faktycznie wykonane, f.InstrumentID jest oceniany i wyjdzie jako wszystko, co było ostatnio ustawione, co jest ostatnią iteracją.

+0

wydaje się to dość ciekawe, skąd mogę uzyskać dokumentację do tego tematu? – JOBG

2

Ponieważ nie ocenia stanu, ale po prostu buduje wyrażenie. Wyrażenie wiąże się z zmienną zdefiniowaną w foreach, która zachowuje odniesienie podczas wykonywania całej pętli. Przedefiniowanie go za pomocą zmiennej tymczasowej zmusza każde wyrażenie do użycia innej zmiennej, co zmusza ją do odniesienia się do instancji z wartością w każdej iteracji, zamiast do wszystkich iteracji, które odnoszą się do pojedynczego odniesienia i mają wartość tylko ostatniej iteracji.

+0

dziękuję, to jest trochę trudne, pamięta mnie czas, gdy bawiłem się tablicami, i chcę skopiować wartości według wartości ... ból głowy, może w prostych słowach oznacza to, że robi to leniwy ładunek wartości, zmiana wartości w czasie i tam jest tylko 1 instante "f". – JOBG