好吧,假设我有很多对很多的,学生/类对象。使用以下映射
HasManyToMany(m => m.Classes)
.Table("StudentClasses")
.LazyLoad()
.Cascade.None();并询问:
return _session.CreateCriteria<Student>()
.Add(Restrictions.Eq("Id", studentId))
.SetCacheable(false)
.UniqueResult<Student>();我的桌子
ID | Student ID | Class StudentId | ClassId
============ =========== ===================
1 | John 1 | Algebra 1 | 1
2 | Sue 2 | Biology 1 | 2
3 | Frank 3 | Speech 2 | 2
4 | Jim 4 | Athletics 2 | 5
5 | Frankenstein 5 | History 5 | 5我想要的是 John,随着代数和生物学的到来,但是生物学伴随着John和Sue,她反过来又给了我Bio和History,后者是苏和Frankenstein的聚集地。你不会想要科学怪人(或生物学以外的任何东西)。而且,在任何时候,你都可以开始循环循环。
我怎么才能规定不深入地填充呢?SetMaxRows显然不是我想要的,因为它减少了总行数,我只想补充第一个级别。我特别困惑,因为我认为LazyLoading会迫使我指定我到底想要补充什么
发布于 2013-08-30 01:09:52
延迟加载允许您不必指定要水合物的内容。当您访问这些集合时,它们将被“懒散地”填充。上面的查询将只获取一行: John。当您访问john.Classes时,NHibernate将在幕后执行另一个查询来获取John的类。然后,当您访问biology.Students属性时,NHibernate将执行另一个查询来填充该集合.诸若此类。
您确实希望延迟加载这种关系(顺便说一句,这是默认的)。如果您关闭了延迟加载,那么这将实现您想要避免的结果-- NHibernate将知道它不允许懒散地加载这些集合,因此,一旦您加载了一个学生,它就会开始加载它们,这可能会导致在这三个表中加载所有数据,并且以一种非常低效的方式加载大量往返数据库。
如果您知道您想要的只是"John,with代数和生物学“,那么您应该在查询中添加以下几行:
.SetFetchMode("Classes", FetchMode.Eager)
.SetResultTransformer(Transformers.DistinctRootEntity)SetFetchMode告诉NHibernate使用左外部联接预填充student.Classes集合。DistintRootEntity告诉NHibernate不要返回由左外部联接生成的重复学生。
https://stackoverflow.com/questions/18495671
复制相似问题