如何使用NHibernate检索List上的条件元素

Pie*_*rOz 5 .net c# nhibernate

我正在使用NHibernate,我有两个映射我的DataBase模式的类:

public class A
{
    public virtual int Id { get; set;}
    public virtual List<B> MyList { get; set; }
}

public class B
{
    public virtual int Id { get; set; }
    public virtual DateTime Date { get; set; }
    public virtual A FKtoA { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想得到表A的所有条目,它们的MyList属性的所有元素都具有小于给定值的Date.

我怎么能用优雅的NHibernate语法做到这一点?

Die*_*hon 1

我欠你“优雅”的部分......:-)

这是一个可能的 HQL。请注意,颠倒了您的条件:我不是寻找“其 MyList 属性的所有元素的日期小于给定值的 A”,而是寻找“其 MyList 属性的任何元素的日期都小于给定值的 A”大于或等于给定值”。

from A a
where a not in 
      (select a1
       from A a1, B b
       where b.Date >= :date
       and   b in elements(a1.MyList))
Run Code Online (Sandbox Code Playgroud)

用法:

var results = session.CreateQuery("hql from above")
                     .SetParameter("date", DateTime.Today)
                     .List();
Run Code Online (Sandbox Code Playgroud)

A请注意,如果您声明和之间的双向关系B(通过添加A属性),则查询会简单得多:

from A a
where a not in 
      (select b.A
       from B b
       where b.Date >= :date)
Run Code Online (Sandbox Code Playgroud)

更新:以下是使用 Criteria 的方法:

session.CreateCriteria<A>().Add(
    Subqueries.PropertyNotIn("id",
                             DetachedCriteria.For<A>()
                                 .CreateCriteria("MyList")
                                 .SetProjection(Projections.Property("id"))
                                 .Add(Restrictions.Ge("Date", DateTime.Today))))
Run Code Online (Sandbox Code Playgroud)