.Any()

2013-03-13 16 views
5

'in tersi nasıl bulunur? Beynim, ayarlamam gereken bir sorguda başarısız oluyor..Any()

public virtual ICollection<Ribbon> Ribbons { get; set; } 
public virtual ICollection<Trophy> Trophies { get; set; } 

Hem Şerit ve Trophy kurdeleler ve kupa doğrudan birbiriyle ilişkili değildir "UmbracoActivityId" adlı bir tamsayı özelliğine sahiptir ancak:

iki (ilgili) özellikleri olan bir kedi nesne var İkisi de bir kedi ve bir UmbracoActivity ile ilgilidir. Kediler, UmbracoActivity'de tamamladıkları her "adım" için bir şerit alır ve tüm adımları bitirmek için bir kupa. Bunlar çok rekabetçi kediler :) konum

Ne yapmak gerek UmbracoActivity başladık ama (bir kupa almadık) tüm adımları tamamlamamış olan kedilerin sayısını bulmak. Düz İngilizce

: kurdelesi olup kedi, kuşağın UmbracoActivityId aynı UmbracoActivityId ile bir kupa var ETMEZ tüm farklı kurdeleler bulabilirsiniz. Ben kodunda var ne

:

var ribbons = db.Ribbons 
    .Where(ribbon => db.Cats.Find(ribbon.CatId) 
     .Trophies.Any(trophy => trophy.UmbracoActivityId == ribbon.UmbracoActivityId)); 

ben yaklaştım ama şerit aynı UmbracoActivityId ile bir kupa var DOES varsa yapacağı her türlü() ifadesi doğrudur. Tam tersine ihtiyacım var. "==" ifadesini "! =" Olarak değiştirmeye çalışmak, ancak bu durumda bir kedinin farklı bir UmbracoActivityId ile birçok kupa olabilir.

ben ters aramak için bir yere deyimi ters ihtiyacım ama yapacak nerede emin değilim :(önceden

Teşekkür

cevap

12

.Any(x == y) -.>.All(x != y)

Eğer orada herhangi maç, ilki başarır. Else başarısız.

herhangi maç, ikincisi başarısız olur. Else başarılı varsa.

+1

+1 Bu aslında '! .. 'dan daha üstündür. Her şey (kısa devre değerlendirmesi) (http://en.wikipedia.org/wiki/Short-circuit_evaluation) sonuçları; Yani, eğer ilk bir eşleşme ise, "All" anında geri dönecek, "Any" ise her öğeyi kontrol edecektir. En azından, LINQ'un böyle davrandığını umuyorum! ^^ – poke

+0

@poke: İyi nokta. Yine de, herhangi bir/tüm Linq to SQL gibi bir şey ile nasıl çalışacağından emin değilim. – voithos

+0

@Trevor Pilley '.Any' ilk maçta geri dönüyor. '.All ', ilk olmayan maçta geri döner.Onlar zıtlıklar – Patashu

4

Sadece negatif kullanın - yani Where(ribbon => !db...Any(...)) (eklenmiş !). herhangi kupa aynı UmbracoActivityId paylaşırsanız

ardından kedi dahil edilmeyecektir.

var ribbons = db.Ribbons 
    .Where(ribbon => !db.Cats.Find(ribbon.CatId) 
     .Trophies.Any(trophy => trophy.UmbracoActivityId == ribbon.UmbracoActivityId)); 
+0

-Teşekkürler, bunun da işe yarayacağını kabul ediyorum. –

0
var ribbons = db.Ribbons 
    .Where(ribbon => db.Cats.Find(ribbon.CatId) 
     .Trophies.All(trophy => trophy.UmbracoActivityId != ribbon.UmbracoActivityId)); 

çeşitli yollar quess bunu yapmak için, ama kediler kupa hiçbiri ribbon.UmbracoActivity kalması halinde bu true döndürür.

Ayrıca kullanın .Exist ve "==" yerine varsayalım.

İlgili konular