2011-04-01 24 views
11

Aşağıdaki nesneleri hiyerarşide A > B > C > D var. Her nesne bir tabloya eşlenir. Ben QueryOver kullanarak aşağıdaki SQL yazmaya çalışıyorum:Karmaşık nHibernate QueryOver ifadesi

SELECT B 
FROM A, B, C, D 
WHERE A.ID = B.ID 
    AND B.ID = C.ID 
    AND C.ID = D.ID 
WHERE A.NUMBER = 'VALUE' 
    AND D.NAME IN ('VALUE1', 'VALUE2') 

şimdiye kadar C# kodu vardır:

string[] entityNames = entityAttributes.Select(e => e.Name).ToArray(); 
string customerNumber = 2; 

return session.QueryOver<B>() 
       .JoinQueryOver(b => b.C) 
       .JoinQueryOver(c => c.D) 
       .WhereRestrictionOn(d => d.Name).IsIn(entityNames) 
       .List<B>(); 

Burada eksik A > B bağlantıdır. Birleştirme, NUMBER alanında kısıtlamak üzere A numaralı bağlantıya nasıl ekleneceğini anlayamıyorum. Aşağıdakileri denedim ama .JoinQueryOver(b => b.C), B türünü bulmak yerine A türünü arıyor. Hala tip B dönerken

return session.QueryOver<B>() 
       .JoinQueryOver(b => b.A) 
        .Where(a => a.Number == customerNumber) 
       .JoinQueryOver(b => b.C) **//Looks for type A instead of B** 
       .JoinQueryOver(c => c.D) 
       .WhereRestrictionOn(d => d.Name).IsIn(entityNames) 
       .List<B>(); 

nasıl bu sorgu türünü A katabilir?

cevap

13

Eğer bunu yararlı umut

B tB = null; 
A tA = null; 
C tC = null; 
D tD = null; 
var qOver = HibSession.QueryOver<B>(() => tB) 
.JoinAlias(() => tB.A,() => tA, JoinType.LeftOuterJoin) 
.Where(() => tA.Number == customerNumber) 
.JoinAlias(() => tB.C,() => tC, JoinType.LeftOuterJoin) 
.JoinAlias(() => tC.D,() => tD, JoinType.LeftOuterJoin) 
.Where(Restrictions.On(() => tD.Name).IsIn(entityNames)) 
.List<B>(); 

gibi tablo katılmak için diğer adları kullanabilirsiniz.

+0

Teşekkür ederiz! Bu benim uygulamamın çoklu senaryolarında bir çekicilik gibi çalıştı! –

İlgili konular