- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题与这个问题非常相似(没有真正回答):Nhibernate: distinct results in second level Collection
我有这个对象模型:
class EntityA
{
...
IList<EntityB> BList { get; protected set; }
...
}
class EntityB
{
... does NOT reference its parent EntityA...
IList<EntityC> CList { get; protected set; }
}
它们是一对多关系。实体 B 和 C 不具有对其父对象的对象引用。
我想通过执行类似于以下三个 SQL 查询的操作来完全加载集合,以避免笛卡尔连接:
SELECT id, ... FROM EntityA;
SELECT id, idA, ... FROM EntityB;
SELECT id, idB, ... FROM EntityC;
这样,DAL 就拥有了正确填充对象的所有信息。但是,由于EntityB不知道其 parent 是谁,因此 要成为适本地填充收藏品的Nhibernate。
可以完成吗?
i 可以使用笛卡尔产品进行此解决方法,但是它需要修改我的模型以提供收集二传器,并且有资格作为我脑海中DAL的技术问题的补丁。
ICriteria criteria = session.CreateCriteria<EntityA>()
.SetFetchMode("BList", FetchMode.Join)
.SetFetchMode("BList.CList", FetchMode.Join)
.SetResultTransformer(new DistinctRootEntityResultTransformer());
IList<EntityA> listA = criteria.List<EntityA>();
foreach (EntityA objA in listA) {
objA.BList = objA.BList.Distinct().ToList();
foreach (EntityB objB in objB.BList) {
objB.CList = objB.CList.Distinct().ToList();
}
}
最佳答案
你试过这种语法吗:
var entities = session.QueryOver<EntityA>().Where(...).List();
var entityIds = entities.Select(e => e.Id).ToArray();
session.QueryOver<EntityA>()
.WhereRestrictionOn(a => a.Id)
.IsIn(entityIds)
.Fetch(e => e.BList).Eager
.List();
var bEntityIds = entities
.SelectMany(e => e.BList)
.Select(b => b.Id)
.ToArray();
session.QueryOver<EntityB>()
.WhereRestrictionOn(b => b.Id)
.IsIn(bEntityIds).Fetch(e => e.CList).Eager
.List();
这应该触发您提到的三个选择。它可能看起来有点令人费解,但它利用了 session 的一级缓存,这确保了第一个集合中的所有实体在执行时使用加载的集合进行更新。
此外,您不必为第二个和第三个查询设置任何复杂的查询逻辑而付出代价。数据库应将主索引用于第二个查询(甚至可能根据您的设置进行聚类),并将外键用于连接以实现极低成本查询。
关于nhibernate - 在 NHibernate 中加载没有重复的多级集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7614661/
我正在开发一个需要能够平均三个数字的 Facebook 应用程序。但是,它总是返回 0 作为答案。这是我的代码: $y = 100; $n = 250; $m = 300; $number = ($y
我只是无法弄清楚这一点,也找不到任何对我来说有意义的类似问题。我的问题:我从数据库中提取记录,并在我的网页上以每个面板 12 条的倍数显示它们。因此,我需要知道有多少个面板可以使用 JavaScrip
我是一名优秀的程序员,十分优秀!