2013-05-09 10 views
8

ja predykaty budynku za klasę PrediateBuilder LinqKit za dynamicznie filtry konfiguracji i chcę połączyć zagnieżdżone jeden do drugiego:.zagnieżdżanie PredicateBuilder predykaty: „Parametr«F»nie był związany w określonym LINQ do podmiotów kwerendy wyrażenia”

Znam ten (http://www.albahari.com/nutshell/predicatebuilder.aspx):

enter image description here

Oto mój kod:

// The main predicate. 
var mainPredicate = PredicateBuilder.True<Document>(); 

// ... some other conditions to the main predicate here ... 

// The inner predicate (combined conditions using OR). 
var innerPredicate = PredicateBuilder.False<Document>(); 

foreach (var period in periods) 
{ 
    var p = period; 
    innerPredicate = 
     innerPredicate.Or(
      d => 
      (d.Date >= p.DateFrom && d.Date <= p.DateTo)); 
} 

mainPredicate = mainPredicate.And(innerPredicate); 

documents = this.ObjectSet.AsExpandable().Where(mainPredicate).ToList(); 

jestem łącząc moje dwa predykaty tak jak to jest opisane w dokumentacji. Jednak uzyskać ten wyjątek:

Parametr „F” nie jest związany z określonym LINQ jednostkach ekspresji zapytanie

po raz pierwszy, że to wewnętrzna orzeczenie musi być rozszerzony przed połączeniem go z głównego orzecznika, więc zmieniłem łącząc kod, aby dodać wywołanie do Expand metody śródmiejskiego orzecznika jest tak:

mainPredicate = mainPredicate.And(innerPredicate.Expand()); 

Ale pojawia się ex działaj w tym samym wyjątku.

Jedyną różnicą w stosunku do mojego kodu dokumentacji jest to, że dynamicznie budować mój zagnieżdżonego predykatu użyciu foreach pętlę. Po prostu nie wiem, jak może negatywnie wpłynąć na wynikową ekspresję.

  • Co jest nie tak z moim kodem?

  • Jak mogę to debugować?

  • Skąd pochodzi parametr f? Jak jest generowany? Dlaczego w moim przypadku jest problematyczne?

  • Czy istnieje jakiś rodzaj wizualizatora drzewa ekspresyjnego, który mógłby mi pomóc zobaczyć, co jest nie tak z wyrażeniem wynikowym? Ponieważ ciało wypowiedzi jest trudne do odczytania.

+1

Patrząc na [to pytanie] (http://stackoverflow.com/questions/2947820/c-sharp-predicatebuilder-entities-the-parameter-f-was-not-bound-in-the-specif) pojawia się być może będziesz musiał użyć 'Expand()' wewnątrz 'Or'' 'innerPredicate' oraz – jszigeti

+0

Próbowałem tego. Dostaję ten sam wyjątek. –

Odpowiedz

4

Wreszcie znalazłem sposób na uniknięcie łączenia wielu predykatów z głównym drzewem wyrażeń.

Biorąc pod uwagę, że każde orzeczenie reprezentuje inny filtr i chcę finału, w połączeniu filtr będzie seria musi-być szanowanym warunki, można powiedzieć, że każda z predykatów musi powrócić prawdziwą dla końcowy predykat, aby zwrócić true.

Aby to działało, predykaty muszą być połączone z AND. Wynikowe zapytanie SQL musi wyglądać następująco:

predicate1 AND predicate2 AND predicate3 ...

Lepszym sposobem łączenia tych orzeczniki z AND jest łańcuchem Where operatorzy zapytanie do końcowego zapytania, na przykład:

var documents = this.ObjectSet.AsExpandable() 
    .Where(mainPredicate) 
    .Where(otherPredicate) 
    .Where(yetAnotherPredicate) 
    .ToList(); 

Zapytanie SQL wynikające zostaną połączone każdy z tych predykatach z AND. Właśnie to chciałem zrobić.

Jest łatwiejsze niż zhackowanie drzewa wyrażeń samodzielnie.