NHibernate QueryOver内部选择的位置

时间:2014-10-15 08:34:16

标签: nhibernate queryover

我将此SQL转换为QueryOver表示法时遇到问题。你能救我吗?

SELECT * FROM Alerts a
WHERE a.CreatedOn = (
    SELECT MAX(b.CreatedOn) FROM Alerts b WHERE b.UserFk=a.UserFk);

我尝试为每个用户选择最后一次提醒。我使用CreatedOn并且不能使用Id。

我到目前为止:

session.QueryOver(() => alertAlias)
        .SelectList(list => list
            .Select(() => alertAlias.User.Id)
            .SelectSubQuery(
                QueryOver.Of<Alerts>()
                    .Where(x => x.User.Id == alertAlias.User.Id)
                    .OrderBy(x => x.CreatedOn).Desc
                    .Select(x => x.CreatedOn)
                    .Take(1)));

我知道它会将用户的最后提醒日期添加到每个用户的提醒行。但是我想要最后一次提醒。

1 个答案:

答案 0 :(得分:0)

您的尝试是在SELECT语句中使用子查询。但我们需要将其移至WHERE。这应该是这样的:

// this is a subquery (SELECT ....
var subquery = QueryOver.Of<Alerts>()
        .Where(x => x.User.Id == alertAlias.User.Id)
        .OrderBy(x => x.CreatedOn).Desc
        .Select(x => x.CreatedOn)
        .Take(1)));

// main Query could now have or do not have that subquery selected
var query = session.QueryOver(() => alertAlias)
    .SelectList(list => list
        .Select(() => alertAlias.User.Id)
        // could be there
        .SelectSubQuery(subquery)
    )
    // but mostly here we do use WHERE clause
    .WithSubquery
        .WhereProperty(() => alertAlias.CreatedOn)
        .Eq(subquery)
        ;

// such a query could be returned as a list of arrays
var results = query.List<object[]>();

我们也可以使用一些Result Transformer,但这是另一个故事......