linq - 子集合和一个

  显示原文与译文双语对照的内容

My" TimeRecord"has一个" WayPoint"集合和两个one-to-one属性" Location"和" WayData"。

每个属性都可以为空。

我需要导出特定用户的所有具有初始化属性的时间记录。

我实际上有一个工作解决方案,然后开始使用 NHibernateProiler,首先注意到这个代码对查询数据库的数量。


var query = (from timeRecord in Session.Query<TimeRecord>()
. Where(tr => tr.User.Id == userid)
 select timeRecord);

然后,我将代码改为:


var query = (from post in Session.Query<TimeRecord>()
. Fetch(x => x.Location)
. Fetch(x => x.WayData)
. FetchMany(x => x.WayPoints)
. Where(tr => tr.User.Id == userid)
 select post);

这导致了我的笛卡尔产品问题。

现在我正在试验这段代码:


 var sql1 ="from TimeRecord b left outer join fetch b.Location where b.User.Id=:User_id";
 var sql2 ="from TimeRecord b left outer join fetch b.WayData where b.User.Id=:User_id";
 var sql3 ="from TimeRecord b left inner join fetch b.WayPoints where b.User.Id=:User_id";


var result = Session.CreateMultiQuery()
. Add(Session.CreateQuery(sql1))
. Add(Session.CreateQuery(sql2))
. Add(Session.CreateQuery(sql3))
. SetParameter("User_id", userid)
. List();

但我不能说这是正确的方法,还是在 NHibernate 中甚至是可能的。 谁能帮我一下?

时间: 作者:

1+N 问题是一个常见的实体/集合映射和ORM工具。 但是 NHibernate 有一个很好的解决方案,如何正确管理它。 它被称为:

这里设置将允许:

  • 继续查询 root 实体( 在我们的例子中是 TimeRecord )
  • 查询( Session.Query<TimeRecord>() ) 内没有获取。 这意味着我们对正确分页有支持。 ( Take()Skip() 将在 flat表执行)
  • 所有的集合都将装载自己的SELECT语句 ( 可能是劣势但下面) 。
  • 将会有更多的 SELECTs选择 1. 所有这些都将被分批。 按 25记录的比如
  • 所有本机映射( 延迟加载集合) 仍将就绪。

xml映射示例:


-- class level
<class name="Location" batch-size="25.. .

-- collection level
<batch name="Locations" batch-size="25".. .

我建议在所有的集合/类上应用它。 此外,使用流畅的映射,也可以通过约定进行。

fluent映射:


//class
public LocationMap()
{
 Id(x => x....
. . .
 BatchSize(25);

//collection
HasMany(x => x.Locations)
. . .
. BatchSize(25);

作者:
...