在 Orchard 服务中调用 SQL 查询

Calling a SQL query in Orchard service

在我的 Orchard 模块(此处称为 "MyModule")中,我需要查询一个数据集,该数据集由多个连接组成,循环回原始 table 以构建朋友列表指定成员。

我用适当的部分定义了两个 ContentItem(为清楚起见省略了其他部分)

Member item => MemberPart, etc.
Friend item => FriendPart, CommonPart

Friend 项上的 CommonPart 用于保存对该 Friend 所属的 Member 的引用。 FriendPart 还包含指向成员记录的指针引用。

我可以使用三个 ContentManager.GetMany() 调用在服务中表达此查询,但在 Orchard 服务中需要一些代码才能完成此操作。

我正在寻找的数据集最简单的表述为 SQL:

SELECT DISTINCT memberFriend.Id
  FROM MyModule_MemberPartRecord member
    INNER JOIN Common_CommonPartRecord common
        ON member.Id = common.Container_id
    INNER JOIN MyModule_FriendPartRecord friend
        ON common.Id = friend.Id
    INNER JOIN MyModule_MemberPartRecord memberFriend
        ON friend.Member_Id = memberFriend.Id
    WHERE member.Id = {parameter}

编码更紧凑,效果更好。

我的问题:如何在 Orchard 中调用 SQL 查询?我是否将 SQL 保存为数据库视图并调用它?还是我构建一个命令并调用它?

在 Orchard 1.8.1 的服务中执行 SQL 查询的合适方法是什么?

private readonly ISessionLocator _sessionLocator;
public Class(ISessionLocator sessionLocator) {
    _sessionLocator = sessionLocator;
}

public void SQL(string sql) {
    var session = _sessionLocator.For(typeof(object));
    session.CreateSQLQuery(sql);
    var list = session.List();
}

您还需要从 Orchard 的 lib 文件夹中添加对 NHibernate 的引用。

您是否看过 ContentManager API 上的 .Query<> 或 .HqlQuery<>?你可以在那里做所有这些连接,应该没问题。也许。或者使用 HQL 本身 (good intro here)。这有一些非常友好的语法,只要在模型中明确映射关系,就可以非常轻松地连接内容。但是,是的,有时 SQL 只是方便的选择 ^_^