简体   繁体   English

使用NHibernate Linq按嵌套对象的属性排序

[英]Order by property of nested object with NHibernate Linq

I have class Request with list of Comments. 我有带有注释列表的Request类。 Each Request can have zero, one or many Comments. 每个请求可以具有零个,一个或多个注释。

public class Request
{
    public virtual string Id
    { get; protected set; }

    public virtual DateTime Date
    { get; set; }

    public virtual byte RequestStatusId
    { get; set; }

    public virtual Payment Payment
    { get; set; }

    public virtual IList<RequestComment> RequestComments
    { get; set; }
}
public class RequestComment
{
    public virtual int Id
    { get; protected set; }

    public virtual DateTime Date
    { get; set; }

    public virtual string CommentText
    { get; set; }

    public virtual Request Request
    { get; set; }

    public virtual User User
    { get; set; }
}

I'm using NHibernate.Linq to get data from database. 我正在使用NHibernate.Linq从数据库中获取数据。 When I sort, for example by Request Id, it looks like this: 当我排序时(例如,按请求ID排序),它看起来像这样:

var query = _session.Query<Request>()
                .Where(r => r.RequestStatusId == requestStatusId)
                .OrderBy(r => r.Id)
                .Skip(pageNo * pageSize)
                .Take(pageSize);
return query.ToFuture().AsQueryable();

When I need last comment for Request I get it like this: 当我需要对请求的最后评论时,我将得到如下信息:

public RequestComment GetLastCommentForRequest(string requestId)
{
    var query = _session.Query<RequestComment>()
            .Where(r => r.Request.Id == requestId)
            .OrderByDescending(r => r.Date)
            .FirstOrDefault();

    return query;
}

Now I need to get Requests, with their last comment (if exists) and all sorted by CommentText. 现在,我需要获取带有最后一条注释(如果存在)的请求,并全部按CommentText排序。 I was trying to do order in Request query with: 我试图用以下命令在请求查询中进行排序:

.OrderBy(x => x.RequestComments.Where(y => y.Request.Id == x.Id).OrderByDescending(y => y.Date).FirstOrDefault())

But it's not working and I'm getting error »Exception has been thrown by the target of an invocation.« 但这无法正常工作,并且出现错误»调用目标抛出了异常。«

UPDATE UPDATE

This is ok, but it's not sorted by last comment, but by first found: 可以,但是不是按最后评论排序,而是按第一个发现排序:

.OrderBy(r => r.RequestComments.Select(x => x.CommentText).FirstOrDefault())

How about this : 这个怎么样 :

.OrderBy(x => x.RequestComments
                .OrderByDescending(y => y.Date)
                .Select(x => x.CommentText)
                .FirstOrDefault()
        )

UPDATE : 更新:

It seems that linq above translated to query with subquery having order by clause which is not allowed. 似乎上面的linq转换为带有不允许使用order by子句的子查询的查询。 Try this instead : 试试这个代替:

.OrderBy(x => x.RequestComments
                .Where(y => y.Date == x.RequestComments.Max(o => o.Date))
                .Select(u => u.CommentText)
                .FirstOrDefault()
        )

您可以尝试:

.OrderBy(x => x.RequestComments.Select(y => y.Date).DefaultIfEmpty().Max())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM