2013-05-22 15 views
7

mam kod:Różnica między PredicateBuilder <True> i PredicateBuilder <False>?

var predicate = PredicateBuilder.True<Value>(); 

predicate = predicate.And(x => x.value1 == "1"); 
predicate = predicate.And(x => x.value2 == "2"); 

var vals = Value.AsExpandable().Where(predicate).ToList(); 

Jeśli mam PredicateBuilder.True<Value>(), przywraca to, co się spodziewać, ale jeśli mam PredicateBuilder.False<Value>(), przywraca 0 rekordów. Czy ktoś może wyjaśnić, na czym polega różnica i dlaczego w jednym scenariuszu wracam 0 nagrań, w drugiej dostaję to, czego się spodziewam. Czytałem już dokumentację PredicateBuilder, ale było to nieco mylące. Mam przeczucie, że ma to związek z tym, że mam orzeczniki w liczbie?

+3

Nie mogę znaleźć żadnej dokumentacji dotyczącej tej klasy, ale przypuszczam, że twoje wywołania tworzą wyrażenie, które jest równoważne "true && (x.value1 ==" 1 ") && (x.value2 == "2") ', które może, ale nie musi być ocenione na' true', w zależności od twoich przedmiotów (stąd otrzymasz "to, czego oczekujesz", cokolwiek to jest). Z drugiej strony, jeśli zaczynasz od 'false', wyrażenie może * nigdy * nie przetestować na' true', ponieważ iing 'false' daje w wyniku" false ". Dlatego wyrażenie predykatu zwraca "false" dla wszystkich elementów i nie otrzymasz żadnych wyników. –

+1

@ O.R.Mapper - Dzięki. Oto dokumentacja: http://www.albahari.com/nutshell/predicatebuilder.aspx – Xaisoft

+0

http://stackoverflow.com/questions/15325245/linqkit-predicatebuilder-returns-all-or-non-rows – mirtiger

Odpowiedz

-1

Jak to działa Metody Prawda i Fałsz nie robią nic specjalnego: są to po prostu wygodne skróty do tworzenia Wyrażenie> które początkowo ma wartość "prawda" lub "fałsz". Tak więc:

var predicate = PredicateBuilder.True(); to skrót:

Wyrażenie> predicate = c => true; Podczas budowania predykatu przez wielokrotne układanie w stosy i/lub warunki, przydatne jest posiadanie punktu początkowego, odpowiednio, prawdziwego lub fałszywego.

Info kompletny http://www.albahari.com/nutshell/predicatebuilder.aspx

1

Podczas korzystania PredicateBuilder aby stopniowo zbudować predykat 0 lub więcej warunków, jest to wygodne, aby rozpocząć z „neutralnego” orzecznika, który może być dodawany do, ponieważ można wtedy tylko iteracyjne przez warunki i albo and albo or je razem z ostatnim. Na przykład.

var predicate = PredicateBuilder.True<Value>(); 

foreach (var item in itemsToInclude) { 
    predicate = predicate.And(o => o.Items.Contains(item)); 
} 

Byłoby to równoznaczne z bardziej prostą logiczną logiki:

var predicate = true; 

foreach (var item in itemsToInclude) { 
    predicate = predicate && o.Items.Contains(item); 
} 

co byłoby równoważne

true && ((o.Items.Contains(itemsToInclude[0] && o.Items.Contains.itemsToInclude[1]) ...) 

Or true && restOfPredicate, które ocenia się true jeśli restOfPredicate jest prawdą, a false, jeśli restOfPredicate jest. Stąd dlaczego jest uważany za neutralny.

Zaczynając od PredicateBuilder.False, jednak byłby równoważny false && restOfPredicate, który zawsze oceniałby na false.

Podobnie do or, wychodząc z false byłoby równoważne false || restOfPredicate, co ocenia się false jeśli restOfPredicate jest false i true jeśli restOfPredicate jest true. I true || restOfPredicate zawsze oceniałby na true.

Konkluzja: Za pomocą PredicateBuilder.True neutralnej punktu wyjścia z PredicateBuilder.And i PredicateBuilder.False z PredicateBuilder.Or.