- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的应用程序现在有一个非常简单的模型,我正试图找到遍历聚合的最佳方法。正如您在底部的模型图中看到的那样,我有一个帐户、一次旅行和参加旅行的人员列表。我希望能够查看一个帐户所属的所有行程,我想出了这样的办法:
public List<Trip> GetAllTripsFor(int accountid)
{
var tripRepository = new TripRepository();
var trips = tripRepository.FindAll();
var userTrips = new List<Trip>();
foreach (Trip trip in trips)
{
foreach (TripPeople person in trip.People)
{
// If this trip's person list contains this accountid
// then add this trip to the userTrips list.
if(person.Account.Id == accountid)
userTrips.Add(trip);
}
}
return userTrips;
}
对我来说,这似乎不是很有效,而且我没有正确考虑事情。你们中有人有更好的实现方法吗?也许我在想我的模型错了?谢谢
最佳答案
我并不惊讶这对你来说感觉不对,事实并非如此。事实上,这是错误的,它伤害了!但不仅仅是让你悲伤,我会解释为什么这是错误的所有原因@
首先,您在从数据库到内存的所有行程中加载,这实质上意味着您正在查询数据存储以获取不需要的全部数据,然后通过网络将其传递。如果您有几次旅行,这很好,但这根本无法扩展。
接下来,您将遍历每次旅行并将属性称为“trip.People”。然后这将再次访问数据库并为这些旅行中的每一次加载人们的所有数据。同样,如果您有多个与会者的多次旅行,这将要了您的命。现在,这是假设您在映射上没有过滤器,或者您已经明确要求 NHibernate 不要延迟加载您的 People 集合,但无论哪种方式,这都是您不想要的整个数据加载。
我的建议是查看有关使用 HQL 或 Linq-To-NHibernate 查询对象模型的 NHibernate 文档,您最终会得到如下所示的查询:
HQL(我的 HQL 很糟糕所以这可能是非常错误的):
var hql = @"from Trip as t join t.People as p with p.Account.Id = :accountId select t"
编辑:
其实我现在脑子有点迟钝了,不过我才发现你这里做事有点倒退。您实际追求的是一个人进行过的所有旅行,那么为什么您的帐户对象没有映射到 Trips 集合呢?您基本上应该以这样的目标为目标:
var trips = accountRepo.GetAccount(123).Trips;
编辑:
我又累了,所以这可能是无稽之谈,但我认为您正在寻找的映射将如下所示:
<bag name="Trip" cascade="all" table="TripToAccount" lazy="true">
<key column="AccountId" />
<many-to-many class="Trip">
<column name="TripId" not-null="true"/>
</many-to-many>
</bag>
编辑:
该死的,我该 sleep 了。现在我看到您已经在人和他们的旅行之间建立了映射,那为什么不呢:
var query = "from TripPeople as tp Where tp.Account.Id = :accountId AND tp.IsActive = true select tp.Trip"
在我做更多愚蠢的事情之前,现在要停止回答了。
关于c# - NHibernate 聚合遍历 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/966490/
我是一名优秀的程序员,十分优秀!