gpt4 book ai didi

nhibernate - 如何优化 CaSTLe ActiveRecord 调用

转载 作者:行者123 更新时间:2023-12-05 00:40:12 24 4
gpt4 key购买 nike

您如何优化 ASP.NET MVC 2 Web 应用程序中的 ActiveRecord 调用?

我坐在我的项目前面,一切都很好,直到我开始填写数据。像很多项目一样,我有一个类似于这样的数据结构:

一个星球有许多国家。一个国家有许多州/省。一个州有许多城市。一个城市有很多街区。

下面是 CaSTLe ActiveRecord/NHibernate 持久化业务对象的示例

[ActiveRecord]
public class Country {

[Property]
public String CountryName { get; set; }

[HasMany(typeof(States))]
public IList<State> States { get; set; }
}

现在假设你想做一个无辜的请求,比如获取地球上所有国家的列表

默认情况下,ActiveRecord/Nhibernate 将加载整个树,直到最后一个依赖项。

结果可能是很多 SQL 调用。

好的,我们可以通过延迟加载来解决这个问题 [ActiveRecord(lazy=true)]但是每当你想做一些像下面这样整洁的事情时
String text = "This country of " + country.CountryName + " has the following states:";

foreach(State s in country.States)
{
text += s.StateName + " ";
}

每次为 s.StateName 获取延迟加载 activerecord 属性时,这是另一个 sql 调用。

这是太多的sql调用。

我的一些 friend 建议使用 ActiveRecordBase 方法,例如 FindAll(criteria)。

但它最终变得非常丑陋并且难以阅读所有这些 Expression.Eq 以及其他内容。

然后其他人也建议使用 HQL 之类的东西。 HQL 看起来很像 SQL。

所以最重要的是,似乎最干净和优化的方法是编写简单明了的 SQL 查询。它直奔主题。
SELECT * FROM Countries //No loading of an entire tree of dependencies

SELECT * FROM States WHERE CountryId = @selectedId //1 call and you have all your states

无论如何,现在我使用 SQL 查询和存储过程来获取数据和 ActiveRecord 来保存/删除对象。

如果我错了,请纠正我......?

谢谢
赞赏。

最佳答案

推荐的方式是使用 默认情况下延迟映射,然后急切地获取 每个案例你需要什么。

如果默认情况下不使用lazy,正如您已经注意到的那样,您会在每个查询中获取几乎整个数据库。

如果您使用惰性但不急切地获取,则会遇到 SELECT N+1您在 foreach 示例中注意到的问题。

到目前为止,我提到的所有内容都与您使用的查询 API 无关。您可以使用 HQL、Criteria、Linq 或 QueryOver 来完成所有这些工作。有些查询更容易用 HQL 表达,而有些时候使用 Criteria、Linq 或 QueryOver 更方便。但同样,这是一个正交问题。

此外,这与使用 ADO.NET 运行原始 SQL 查询没有太大区别。在您的示例中,如果您想要一个带有州的国家/地区,您可以通过 INNER JOINed 预先获取所有州,而不是为每个州发布单独的 SELECTs。

关于nhibernate - 如何优化 CaSTLe ActiveRecord 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4028163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com