2009-05-05 6 views
1

Ich habe folgendes Szenario in nHibernate (sorry für die XML vermasselt, aber der Text-Editor wurde „hilft mir“ ein wenig zu viel, während ich versuchte, es zu kopieren in ;-))nHibernate Tasche Abfrage Ausgabe

<class name="TestApp.Components.User,TestApp.Components" table="Users"> 

<id name="Id" column="UserId" type="Int32" unsaved-value="0"> 
    <generator class="native"></generator> 
</id> 

<property name="UserName" type="string" length="100" not-null="false"/> 

<bag name="Groups" table="User_Group" lazy="true" > 
    <key column="UserId"></key> 
    <many-to-many class="Group" column="GroupId" /> 
</bag> 

<class>

ich brauche eine Abfrage schreiben können alle Benutzer zurückzugeben, die in einer Sammlung von Gruppen sind.

im Wesentlichen möchte ich die folgende SQL auszuführen:

select distinct username from users u, user_group ug
WHERE u.userid = ug.userid
AND (ug.groupid = 1 OR ug.groupid = 2 OR ug.groupid = 3)

Ich weiß, dass ich dies in HQL tun kann, aber ich will es tun, um die ICriteria Schnittstelle.

var session = sessionManager.GetSession();
var items = session.CreateCriteria(typeof(User));

ICriterion criterion = null; 

foreach (var groupid in Groups) 
{ 
    ICriterion tempCriterion = Restrictions.Eq("Groups.GroupId", groupid); 
    criterion = criterion == null ? tempCriterion : Restrictions.Or(criterion, tempCriterion); 
} 
items.Add(criterion); 

Ich habe die oben versucht, aber es Fehler, und ich kann nicht scheinen, um herauszufinden, was mir fehlt. in der Abfrage.

Kann mir jemand in die richtige Richtung zeigen, wie ich diese Abfrage strukturieren muss.

Danke, Max Schilling

Antwort

0

ich eine gute Lösung zu finden für diese endete:

if (Groups!= null && Groups.Count > 0) 
{ 
    var items = Groups.ConvertAll(i => i.Id).ToArray(); 

    criteria.CreateCriteria("Groups", "g", JoinType.LeftOuterJoin); 
    criteria.Add(Restrictions.In("g.Id", items)); 
} 

Dieses genau das tut, was ich suche.

0

Try this:

var groupsCrit = items.CreateCriteria("Groups"); 
var groupIds = Restrictions.Disjunction(); 
foreach (var groupid in Groups) 
{ 
    groupIds.Add(Restrictions.Eq("Id", groupid)); // "Id" should be the name of the Id property on the Group class 
} 
groupsCrit.Add(groupIds);