2009-08-26 22 views
12

yerine sorgular ortaya çıkıyor Bu açık bir şey olabilir ama kafamı bir kaç saatliğine vuruyorum ve yanlış gittiğimi anlayamıyorum.NHibernate disjunction ve OR

NHibernate sorgusuna OR ölçütlerini ekleme ölçmek için küçük bir kod parçası çalıştırmaya çalışıyorum. Ben kimlikleri ile 1-3 tüm test nesneleri döndürmek için beklediğiniz kadar basit bir şey sadece

using (ISession session = NHibernateHelper.OpenSession()) 
{ 
    ICriteria criteria = session.CreateCriteria<TestObject>(); 

    int[] ids = {1, 2, 3}; 
    foreach (int id in ids) 
    { 
     ICriterion criterion = Restrictions.Eq("Id", id); 
     criteria.Add(Restrictions.Disjunction().Add(criterion)); 
    } 

    IList<TestObject> items = criteria.List<TestObject>(); 
    return items; 
} 

var: Bu aldığım kodudur. Ancak, kodu çalıştırdığımda, oluşturulan sorgu ID = 1 VE ID = 2 VE ID = 3 olan bir nesne bulmaktır. Bu, şaşırtıcı bir şekilde hiçbir şey döndürmez.

Eşleme işlemi doğru şekilde yapılmış (tüm nesneleri ekleyebilir/silebilir/kaldırabilir/listeleyebilirim) ve orada bu kimlikleri olan nesneler vardır.

Açıkçası yanlış bir şey yapıyorum? Çevrimiçi gördüğüm Disjunction kullanmanın tüm örnekleri bunu bu şekilde kullanıyor gibi görünüyor. Sadece neden kullanıp kullanmayacağımı anlamıyorum AND.

Teşekkürler.

cevap

16

Sorununuz, her seferinde (döngüde) yeni disjunction oluşturuyor olmanızdır. Ne yapmanız gereken ise:

int[] ids = {1, 2, 3}; 
ICriterion disjunction = Restrictions.Disjunction(); 
foreach (int id in ids) 
{ 
    ICriterion criterion = Restrictions.Eq("Id", id) 
    disjunction.Add(criterion); 
} 
criteria.Add(disjunction); 

sözdizimi biraz yanlış olabilir - Ben, orijinal kod gibi bir şey üretecek bir hazırda adam yerine .NET

netleştirmek için :-) değilim () sözde kodda:

WHERE (OR(ID=1)) AND (OR(ID=2)) AND (OR(ID=3)) 

şey yok bu yana "OR", kopmalar sessizce ihmal edilmiştir etmek için. ChssPly76 en Yanıta göre

+1

Sihirli bir tedavi çalıştı. Senin koduna baktığımda mantıklı geliyor - Ben asla bireysel OR'leri "ve-ing" olacağını düşündüm. Kodunuzdaki tek küçük değişiklik, aşağıdaki gibi birleşim oluşturuyor: Junction disjunction = Restrictions.Disjunction(); (ICriterion 'add' içermiyor). Teşekkürler! –

5

Güncelleme kod:

using (ISession session = NHibernateHelper.OpenSession()) 
{ 
    ICriteria criteria = session.CreateCriteria<TestObject>(); 
    Junction disjunction = Restrictions.Disjunction(); 

    int[] ids = {1, 2, 3}; 
    foreach (int id in ids) 
    { 
     ICriterion criterion = Restrictions.Eq("Id", id); 
     disjunction.Add(criterion); 
    } 
    criteria.Add(disjunction); 


    IList<TestObject> items = criteria.List<TestObject>(); 
    return items; 
}