Nhibernate Queryover,如何访问嵌套的proeprty

时间:2017-03-13 09:29:48

标签: c# nhibernate queryover

这是我的模特

public class A{
    public int Id {get; set;}
    public ICollection<B> bs {get; set;}
}

public class B{
    public int Id {get; set;}
    public ICollection<C> cs {get; set;}
}

public class C{
    public int Id {get; set;}
}

现在我想获得A对象的B对象的C类的Max(Id):

public int GetMaxId(int idA, int idB)

我尝试了一些不同的方式:

var max= _session.QueryOver<A>().Select(a => a.Bs)
.Where(a => a.Id == idA).SingleOrDefault<ICollection<B>>()
.Where(b => b.Id == idB).FirstOrDefault<B>().Cs.Max(c => c.Id);

var max = _session.QueryOver<A>().Where(a => a.Id == idA).Select(a => a.Bs.Where(b => b.Id == idB)).Future<B>().Max(c => c.Id);

但没有任何作用

任何方式这样做?感谢

1 个答案:

答案 0 :(得分:2)

首先请注意SingleOrDefaultFirstOrDefault结束您的查询。之后的所有内容都将在内存中处理,而不是在数据库中处理!除此之外,你有可能在这些方法之后NullReferenceException

要在QueryOver API中使用嵌套属性,您需要使用别名。如标题'别名'下的here所示。

但我认为最简单的方法是使用LINQ:

_session.Query<A>()
    .Where(a => a.Id == idA)
    .SelectMany(a => a.Bs)
    .Where(b => b.Id == idB)
    .SelectMany(b => b.Cs)
    .Max(c => (int?)c.Id) // the cast makes sure you don't get a null reference (tnx to gt.guybrush)