2013-05-22 33 views
7

Ben kod var: Ben PredicateBuilder.True<Value>() varsaPredicateBuilder <True> ve PredicateBuilder <False> arasındaki fark nedir?

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(); 

, ben beklediğiniz geri getiriyor ama PredicateBuilder.False<Value>() varsa, geri 0 kayıtları getirir. Birisi farkın ne olduğunu açıklayabilir mi ve neden bir senaryoda geri döndüğümde bir senaryoda diğeri beklediğimi elde ederim. Zaten PredicateBuilder belgesini okudum, ama biraz kafa karıştırıcıydı. Ben Anding yüklemlerinin birlikte olduğum gerçeğiyle ilgili bir his var mı?

+3

Bu sınıfa ilişkin bir belge bulamıyorum, ancak aramalarınızın 'true && (x.value1 ==" 1 ") && (x.item2 == "2") ', öğelerinize bağlı olarak 'true' olarak değerlendirilebilecek veya olmayabilir (dolayısıyla ne bekliyorsunuz?). Eğer 'false' den başlarsanız, öte yandan, ifade, hiçbir zaman "true" olarak değerlendiremez, çünkü "false" ve "false" ile sonuçlanır. Bu nedenle, yüklem ifadesi tüm öğeler için 'false' değerini döndürür ve sonuçlara geri dönmezsiniz. –

+1

@ O.R.Mapper - Teşekkürler. İşte belgeler: http://www.albahari.com/nutshell/predicatebuilder.aspx – Xaisoft

+0

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

cevap

-1

Nasıl Çalışır? Doğru ve Yanlış yöntemleri özel bir şey yapmaz: Bunlar, ilk önce doğru veya yanlış olarak değerlendiren bir İfade oluşturma için yalnızca uygun kısayollardır. Bu nedenle aşağıdakiler:

var predicate = PredicateBuilder.True(); bunun için sadece bir kısayoldur:

İfade> predicate = c => true; Yinelemeli olarak istifleme ve/veya koşullarla bir yüklemeyi oluşturduğunuzda, doğru veya yanlış (başlangıç) bir başlangıç ​​noktasına sahip olmanız yararlı olur. tam

Bilgi sonra sadece yineleme çünkü http://www.albahari.com/nutshell/predicatebuilder.aspx

1

aşamalı 0 veya daha fazla koşulların bir yüklemi oluşturmak için PredicateBuilder kullanarak, eklenebilir bir "nötr" yüklemi ile başlamak uygun olur koşullar aracılığıyla ve son olarak and veya or bunları birlikte. Örneğin.

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

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

Bu daha basit boolean mantığı eşdeğer olacaktır:,

var predicate = true; 

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

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

Veya true && restOfPredicate eşdeğer olacaktır restOfPredicate doğrudur true eğer değerlendirir ve restOfPredicatefalse ise false. Bu yüzden neden tarafsız kabul edilir. Bununla birlikte, PredicateBuilder.False ile başlayan, her zaman false olarak değerlendirilen false && restOfPredicate eşdeğeri olacaktır. Bu, false.

Benzer or için, false ile başlayan restOfPredicate true ise restOfPredicate false ve true ise false değerlendirmek false || restOfPredicate, eşdeğer olacaktır. Ve true || restOfPredicate her zaman true'a değerlendirir.

Özetle: PredicateBuilder.Or ile PredicateBuilder.And ile nötr bir başlangıç ​​noktası olarak PredicateBuilder.True ve PredicateBuilder.False kullanın.

İlgili konular