2010-12-04 4 views
1

Ich versuche, eine Verknüpfung zu erstellen, um eine Liste der übergeordneten Objekte basierend auf einem untergeordneten Objekt Datumsfeld zu laden. Ich möchte nur übergeordnete Objekte, bei denen das Datum> = ein bestimmtes Datum ist.NHibernate CreateCriteria funktioniert nicht ordnungsgemäß mit Zuordnung und Daten

Das Problem ist, wenn ich entweder das heutige Datum oder den Vortag verwende, gibt es die richtigen Kinder zurück. Aber wenn ich ein Datum weiter hinten in der Zeit, wie 11-2-2010 verwende, ist es einschließlich Kinder, die ein Datum < 11-2-2010 haben. Hier

ist der Code:

public IList<Parent> GetByDate(string parentId, DateTime date) { 
    IList<Parent> list = null; 
    using (ISession session = SessionFactory.OpenSession()) { 
    list = session.CreateCriteria(typeof(Parent)) 
         .Add(Expression.Eq("parent_id", parentId)) 
         .CreateCriteria("children") 
         .Add(Expression.Gt("end_date", date)).List<Parent>(); 
    } 
    return list; 
} 

und die Zuordnung für Parent:

<id name="id"> 
    <generator class="native"/> 
</id> 

<property name="parent_id" /> 

<bag name="children" lazy="false"> 
    <key column="parent_id" /> 
    <one-to-many class="Child" /> 
</bag> 

Vielen Dank im Voraus!

Antwort

1

Hinzufügen von Einschränkungen der Kriterien wird nicht beeinflussen, was Kinder geladen werden, nur das, was Eltern (was nicht Sinn in Ihrem Fall nicht machen, weil Sie bereits eine parentId haben, verwenden ISession.Get)

Wenn Sie brauchen Um die Kindersammlung zu filtern, verwenden Sie ISession.CreateFilter.

Beispiel:

var parent = session.Get<Parent>(parentId); 
var children = session.CreateFilter(parent.children, "where end_date > :date") 
         .SetParameter("date", date) 
         .List<Children>(); 

Dies setzt voraus, die Sie gesucht haben, Filterung auf end_date genannt wird, die nicht .NET-Namenskonventionen folgt, aber ist das, was Sie geschrieben haben.

+0

jede chance Sie können ein Beispiel mit meinem Code \ Mapping? Ich denke ich verstehe was du sagst, aber ein Beispiel wäre kewl. – chipman

Verwandte Themen