gpt4 book ai didi

asp.net-mvc - 我可以(并且应该)强制 NHibernate future 的查询在某个时间点执行吗?

转载 作者:行者123 更新时间:2023-12-04 20:21:16 24 4
gpt4 key购买 nike

我在 MVC 3 Web 应用程序中使用 NHibernate future 查询,并试图让我的所有数据库访问都发生在我的 Controller 中,而不是在我的 View 中。该站点是一个资源目录(描述性简介),其中包含多对多的成绩集合和多对多的主题集合。用户选择一个或多个年级,一个或多个主题,然后获得匹配资源列表。

为了填充搜索表单,我使用 future 的查询来获取所有成绩和主题:

    public Domain.SearchFormData GetSearchFormData()
{
// Get all grades and all topics using a multiquery.

IEnumerable<Grade> grades = Session.QueryOver<Grade>()
.Future();

IEnumerable<Topic> topics = Session.QueryOver<Topic>()
.Future();

var result = new SearchFormData();
result.Grades = grades;
result.Topics = topics;
return result;
}

这非常简单且工作正常,并返回 SearchFormData ,这是一个简单的 DTO。此查询在 Controller 中执行,结果不需要任何进一步处理,因此它直接传递到 View 中以呈现为复选框列表。

但是由于 future 查询的延迟执行,直到 View 开始迭代列表才会触发数据库访问。一些人(比如 NHibernate Profiler)认为这是一个禁忌,他们说当 View 开始渲染时,所有的数据库访问都应该完成。主要原因是如果你不这样做,很容易隐藏 SELECT N+1 。

这里不适用; Grade 和 topic 都是没有集合的简单对象。我不太介意 View 会触发数据库访问。但这让我寻找一种干净、清晰的方式来触发所有 future 的查询。一种方法是访问结果,例如复制 IEnumerable成一个列表。但这并不是我真正需要做的事情。我只想执行排队的查询。

我认为触发器发生在上面的查询之外是有意义的。我可能需要其他数据来呈现整个页面 View ,并且我可能会使用其他 future 的查询来获取它。例如,主页可能还会显示五个最受欢迎的资源和资源总数。然后 Controller 将调用多个方法来累积 View 所需的内容,并且一次执行所有这些方法是最有效的。当然,一种方法是扩展我的 GetSearchFormData进入 GetAllHomePageData并返回一个 DTO,其中包含主页上所有内容的字段。但我在所有地方都使用搜索表单,而不仅仅是在主页上。所以我会以这种方式失去一些很好的模块化。

最佳答案

下面的方法需要一点润色,但无论如何都是这样。我希望它对某人有用。我可能稍后会回来清理它。

对于 LINQ、HQL 和 SQL 查询 future ,使用:

public static void ExecuteFutureQueries(this ISession session)
{
var sessionImpl = (ISessionImplementor) session;
var dummy = sessionImpl.FutureQueryBatch.Results;
}

对于 QueryOver 和 ICriteria future ,使用:
public static void ExecuteFutureCriteria(this ISession session)
{
var sessionImpl = (ISessionImplementor) session;
var dummy = sessionImpl.FutureCriteriaBatch.Results;
}

不过要小心。当没有该类型的 future 查询时调用此方法将导致抛出异常。

关于asp.net-mvc - 我可以(并且应该)强制 NHibernate future 的查询在某个时间点执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6333608/

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