对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; }}我想创造一个查询那会给我所有请求最近反应(关于其时间戳)是成功..这是如何做到的呢?
3 回答
HUH函数
TA贡献1836条经验 获得超4个赞
// final Request selectionSELECT request.[RequestId] FROM [Request] request // Only requests, which are successful, and have Max(date) WHERE request.[RequestId] IN ( SELECT successResponse.RequestId as y0_ FROM [Response] successResponse // response which max date is equal to the upper response // and which RequestId corresponds with supper upper Request WHERE EXISTS ( SELECT maxResponse.RequestId as y0_ , max(maxResponse.[DateTime]) as y1_ FROM [Response] maxResponse // do the MAX only for current Request WHERE maxResponse.RequestId = successResponse.RequestId GROUP BY maxResponse.RequestId // assure that the Response match is on the max DateTime HAVING max(maxResponse.[DateTime]) = successResponse.[DateTime] ) AND successResponse.[Success] = 1 )
期待 反应 有
RequestId
上面用的是C# //
注释而不是SQL --
// This declaration will allow us, to use a reference from middle SELECT// in the most deeper SELECTResponse response = null;// the most INNER SELECTvar maxSubquery = QueryOver.Of<Response>() .SelectList(l => l .SelectGroup(item => item.RequestId) .SelectMax(item => item.DateTime) ) // WHERE Clause .Where(item => item.RequestId == response.RequestId) // HAVING Clause .Where(Restrictions.EqProperty( Projections.Max<Response>(item => item.DateTime), Projections.Property(() => response.DateTime) ));// the middle SELECTvar successSubquery = QueryOver.Of<Response>(() => response) // to filter the Request .Select(res => res.RequestId) .WithSubquery .WhereExists(maxSubquery) // now only these wich are successful .Where(success => success.Success == true) ;
// the most outer SELECTvar query = session.QueryOver<Request>();query.WithSubquery // our Request ID is IN(... .WhereProperty(r => r.ID) .In(successSubquery);var list = query .List<Request>();
Cats萌萌
TA贡献1805条经验 获得超9个赞
Query
session.Query<Request>() .Where(request => request.Responses.Count() > 0 && request.Responses.OrderByDescending(response => response.Timestamp) .First() .Success);
慕码人2483693
TA贡献1860条经验 获得超9个赞
SelectList
.Select()
- 3 回答
- 0 关注
- 621 浏览
添加回答
举报
0/150
提交
取消