使用 QueryOver 的查询分隔

using QueryOver's query separated

我如何使用 QueryOver 的 linq 查询,像下面的 ICriteria 一样分隔,它将在通用方法中使用?

ICriterion c = Restrictions.And(Restrictions.Eq("Name", "Foo"),
     Restrictions.Or(Restrictions.Gt("Age", 21), Restrictions.Eq("HasCar",true)));

    IQueryOver<Foo> c = session.QueryOver<Foo>().Where((k => k.Name == "Tiddles" 
                  && k => k.Age== 21) || k => k.Age < 21);

    public static IList<T> All(ICriterion c)
    {
        using (var session = NHibernateHelper<T>.OpenSession())
        {
            var CC = session.CreateCriteria(typeof(T));
            CC.Add(c);
            return CC.List<T>();
        }
    }

您可以传入 Expression<Func<T, bool>>,这是 Where 重载之一接受的内容,而不是条件。

System.Linq.Expressions.Expression<Func<Foo, bool>> c = k => 
    (k.Name == "Tiddles" &&  k.Age== 21) || k.Age < 21;

public static IList<T> All(Expression<Func<T, bool>> expression)
{
    using (var session = NHibernateHelper<T>.OpenSession())
    {
        return session.QueryOver<T>()
            .Where(expression)
            .List();
    }
}

相当于第一行,lambda形式是

ICriterion cr = Restrictions.Where<Foo>(k => k.Name == "Foo" && (k.Age > 21 || k.HasCar));