Nhibernate Queryover,如何访问嵌套属性
Nhibernate Queryover, how to access nested proeprty
这是我的模型
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 class 的 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);
但没有任何效果
有什么办法吗?谢谢
首先请注意,SingleOrDefault
和 FirstOrDefault
结束了您的查询。之后的一切都会在内存中处理,而不是在数据库中!除此之外,在这些方法之后你还有机会NullReferenceException
。
要在 QueryOver
API 中使用嵌套属性,您需要使用别名。如标题 'Aliases'.
下所示 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)
这是我的模型
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 class 的 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);
但没有任何效果
有什么办法吗?谢谢
首先请注意,SingleOrDefault
和 FirstOrDefault
结束了您的查询。之后的一切都会在内存中处理,而不是在数据库中!除此之外,在这些方法之后你还有机会NullReferenceException
。
要在 QueryOver
API 中使用嵌套属性,您需要使用别名。如标题 'Aliases'.
但我认为最简单的方法是改用 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)