2011-05-17 19 views
7

Şu anda düzgün giden NH3.1 sürümüne geçme sürecindeyiz - Her şey mevcut kodla anlattığımız kadarıyla çalışıyor. 'dan biri, 2'den NH3'e geçme motivasyonları Linq desteğinden yararlanmak ve genellikle çok iyi çalışıyor.
p bir Person ve bir registrationr bir vardır:NHibernate 3.1 İçindekiler ve Herhangi Biri

var results = from r in registrations 
       where ( 
         from p in persons 
         where p.ExplicitManagers.Any(m => m.Manager == manager) 
         select p 
        ).Contains(r.Registrant) 
       select r; 

modelidir: Ancak maddeleri, özellikle bir alt koleksiyonu dayalı kontrol etmek istiyorum zaman nerede biraz daha karmaşık ile mücadele duyuyorum p türünde ExplicitManager ilişkisel varlıkları içeren bir kayıt numarası 'un başka bir Person (yönetici) referansına sahiptir.

not: IQueryable<Registration>.Query() ve numaralı kişilerde IQueryable<Person>.Query() numaralı telefon numaraları kaydedilmiştir.
Esasen, kayıtları p'un açık bir yöneticisi olan person1 adresinde kısıtlamaya çalışıyorum. Bunu birleştirme yoluyla yapabilirim, ancak Contains alt sorgusu ile yapamam.

aşağıdaki hatayı alıyorum:

"System.InvalidOperationException : Sequence contains more than one matching element"

sonuçta ben (aslında olan yeniden kullanılabilir hale getirmek için yöneticiler kontrol etmek için mantığı yansıtmak için gerektiğinden bir alt sorgu olarak bunu nedeni Daha karmaşık ancak bu örnek için için sadeleştirdim, çünkü Contains içindeki Any keder yaratıyor). Herhangi bir alt sorgusu olmadığında iyi çalışıyor gibi görünüyor. Bu, yanlış yaptığım bir şey mi, yoksa desteklenmeyen bir şey mi yoksa bir hatadır ve aynı şeyi elde etmenin başka bir yolu var mı?

Verebileceğiniz her türlü yardım için çok teşekkürler.

cevap

7

kullanarak, düzgün çalışması için görünmüyor Any yapar: iyi çalışır

var results = from r in registrations 
       where ( 
         from p in persons 
         where p.ExplicitManagers.Any(m => m.Manager == manager) 
         select p 
        ).Any(p=>p == r.Registrant) 
       select r; 
1

Alt sorgusu kendi kendine sorunsuz olarak çalıştırabilir misiniz? Contains iken

var result = from p in persons 
where p.ExplicitManagers.Any(m => m.Manager == manager) 
select p; 
+0

Evet. Herhangi bir alt sorgunun içinde göründüğünde yalnızca bir sorun var gibi görünür/'İçerir' – IThasTheAnswer

+1

Tesadüfen aşağıdaki işleri buldum: var sonuçlar = kayıtlarda r'den ( ) m => m.Manager == manager) seç p ) .Any (x => x == r.Registrant) r öğesini seçin; benim acil sorunumu çözen – IThasTheAnswer