猿问

对HasMany引用的查询

对HasMany引用的查询

我有一个这样的实体模型:

public class Request{
    public virtual IList<Response> Responses { get; set; }}public class Response{
    public virtual DateTime Timestamp { get; set; }
    public virtual bool Success { get; set; }}

我想创造一个查询那会给我所有请求最近反应(关于其时间戳)是成功..这是如何做到的呢?


胡说叔叔
浏览 622回答 3
3回答

HUH函数

如差不多了一直以来,NHibernate确实对此有答案。我们在这里试图实现的是这样一个SQL语句://&nbsp;final&nbsp;Request&nbsp;selectionSELECT&nbsp;request.[RequestId]&nbsp; &nbsp;FROM&nbsp;[Request]&nbsp;request&nbsp; &nbsp;&nbsp;&nbsp;//&nbsp;Only&nbsp;requests,&nbsp;which&nbsp;are&nbsp;successful,&nbsp;and&nbsp;have&nbsp;Max(date) &nbsp;&nbsp;&nbsp;WHERE&nbsp;request.[RequestId]&nbsp;IN&nbsp; &nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;successResponse.RequestId&nbsp;as&nbsp;y0_&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;[Response]&nbsp;successResponse&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;response&nbsp;which&nbsp;max&nbsp;date&nbsp;is&nbsp;equal&nbsp;to&nbsp;the&nbsp;upper&nbsp;response &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;and&nbsp;which&nbsp;RequestId&nbsp;corresponds&nbsp;with&nbsp;supper&nbsp;upper&nbsp;Request &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;EXISTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;maxResponse.RequestId&nbsp;as&nbsp;y0_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;max(maxResponse.[DateTime])&nbsp;as&nbsp;y1_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;[Response]&nbsp;maxResponse&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;do&nbsp;the&nbsp;MAX&nbsp;only&nbsp;for&nbsp;current&nbsp;Request &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;maxResponse.RequestId&nbsp;=&nbsp;successResponse.RequestId&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GROUP&nbsp;BY&nbsp;maxResponse.RequestId&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;assure&nbsp;that&nbsp;the&nbsp;Response&nbsp;match&nbsp;is&nbsp;on&nbsp;the&nbsp;max&nbsp;DateTime &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HAVING&nbsp;max(maxResponse.[DateTime])&nbsp;=&nbsp;successResponse.[DateTime] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;successResponse.[Success]&nbsp;=&nbsp;1 &nbsp;&nbsp;&nbsp;)注:期待反应&nbsp;有&nbsp;RequestId上面用的是C#//注释而不是SQL--现在,NHibernate和QueryOver的魔力://&nbsp;This&nbsp;declaration&nbsp;will&nbsp;allow&nbsp;us,&nbsp;to&nbsp;use&nbsp;a&nbsp;reference&nbsp;from&nbsp;middle&nbsp;SELECT//&nbsp;in&nbsp;the&nbsp;most&nbsp;deeper&nbsp;SELECTResponse&nbsp;response&nbsp;=&nbsp;null;//&nbsp;the&nbsp;most&nbsp;INNER&nbsp;SELECTvar&nbsp;maxSubquery&nbsp;=&nbsp;QueryOver.Of<Response>() &nbsp;&nbsp;&nbsp;.SelectList(l&nbsp;=>&nbsp;l&nbsp;&nbsp;&nbsp;&nbsp;.SelectGroup(item&nbsp;=>&nbsp;item.RequestId) &nbsp;&nbsp;&nbsp;&nbsp;.SelectMax(item&nbsp;=>&nbsp;item.DateTime) &nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;WHERE&nbsp;Clause &nbsp;&nbsp;&nbsp;.Where(item&nbsp;=>&nbsp;item.RequestId&nbsp;==&nbsp;response.RequestId) &nbsp;&nbsp;&nbsp;//&nbsp;HAVING&nbsp;Clause &nbsp;&nbsp;&nbsp;.Where(Restrictions.EqProperty( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.Max<Response>(item&nbsp;=>&nbsp;item.DateTime), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.Property(()&nbsp;=>&nbsp;response.DateTime) &nbsp;&nbsp;&nbsp;&nbsp;));//&nbsp;the&nbsp;middle&nbsp;SELECTvar&nbsp;successSubquery&nbsp;=&nbsp;QueryOver.Of<Response>(()&nbsp;=>&nbsp;response) &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;to&nbsp;filter&nbsp;the&nbsp;Request &nbsp;&nbsp;&nbsp;&nbsp;.Select(res&nbsp;=>&nbsp;res.RequestId) &nbsp;&nbsp;&nbsp;&nbsp;.WithSubquery &nbsp;&nbsp;&nbsp;&nbsp;.WhereExists(maxSubquery) &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;now&nbsp;only&nbsp;these&nbsp;wich&nbsp;are&nbsp;successful &nbsp;&nbsp;&nbsp;&nbsp;.Where(success&nbsp;=>&nbsp;success.Success&nbsp;==&nbsp;true) &nbsp;&nbsp;&nbsp;&nbsp;;此时我们不得不对内子进行选择,嵌套。让我们使用它们://&nbsp;the&nbsp;most&nbsp;outer&nbsp;SELECTvar&nbsp;query&nbsp;=&nbsp;session.QueryOver<Request>();query.WithSubquery &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;our&nbsp;Request&nbsp;ID&nbsp;is&nbsp;IN(... &nbsp;&nbsp;&nbsp;&nbsp;.WhereProperty(r&nbsp;=>&nbsp;r.ID) &nbsp;&nbsp;&nbsp;&nbsp;.In(successSubquery);var&nbsp;list&nbsp;=&nbsp;query&nbsp;&nbsp;&nbsp;&nbsp;.List<Request>();最后,我不是在讨论这个概念。不是表演。我会使用一个关于响应“IsActive”的设置,使它更容易..这就是该怎么做的答案.。

Cats萌萌

我要试试这个,这里有一些Linq(使用Query)。session.Query<Request>() &nbsp;&nbsp;&nbsp;&nbsp;.Where(request&nbsp;=>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Responses.Count()&nbsp;>&nbsp;0&nbsp;&&&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Responses.OrderByDescending(response&nbsp;=>&nbsp;response.Timestamp) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.First() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Success);不知道这是否行得通。

慕码人2483693

SelectList表示投影,即我们要返回的一组列/公式。因此,非常深的SELECT必须返回2个值,这些值用于上层查询。(寻找匹配的记录)..可能会吧.Select()带着帕拉姆我也要说.。在子查询中使用get(1)在这种情况下不起任何作用。DB引擎将创建正确的执行计划,一旦找到匹配。它会停止的。因此,在这个层面上,它是不需要的。如果我完全理解你的观点。总之,我们的任何优化,帮助DB引擎.。(可受欢迎;)&nbsp;
随时随地看视频慕课网APP
我要回答