2012-09-01 38 views
5

Tôi thực sự có thể sử dụng một số hướng dẫn về cách thực hiện truy vấn sql này với NHibernate QueryOver. Nỗ lực của tôi là sử dụng LINQ vì tôi quen với Linq hơn một chút. Dự án mà chúng tôi đang thực hiện đang sử dụng QueryOver nên có thể tốt nhất là nên duy trì tuyến đường đó ngay bây giờ.NHibernate Làm thế nào để chuyển đổi truy vấn SQL này thành QueryOver hoặc LINQ

Working SQL Query: Làm tròn DateTime đến 1 phút và nhóm/loại/đếm đúng ...

select dateadd(minute,(datediff(minute,0,dateTimeColumn)/1)*1,0), COUNT(*) 
from PartData 
group by dateadd(minute,(datediff(minute,0,dateTimeColumn)/1)*1,0) 
order by dateadd(minute,(datediff(minute,0,dateTimeColumn)/1)*1,0) 

Returns dự kiến ​​kết quả:

2012-08-31 00:00:00.000, 3 
2012-08-31 00:01:00.000, 4 
2012-08-31 00:02:00.000, 3 
2012-08-31 00:03:00.000, 3 
2012-08-31 00:04:00.000, 4 
2012-08-31 00:05:00.000, 3 
2012-08-31 00:06:00.000, 3 
2012-08-31 00:07:00.000, 4 
2012-08-31 00:08:00.000, 3 

EDIT

Tôi đang tiến gần hơn ...

private IQueryOver<entities.PartData, entities.PartData> PartPerHourQuery(ISession session) 
{ 
    return session.QueryOver<entities.PartData>() 
     .Select(
      Projections.Alias(
       Projections.GroupProperty(
        Projections.SqlFunction(
         new SQLFunctionTemplate(NHibernateUtil.DateTime, "DateAdd(mm,1,Date)"), 
         NHibernateUtil.DateTime, _partsDate)) 
       , "Date"), 
      Projections.Alias(Projections.RowCount(), "Count")) 
       .TransformUsing(Transformers.AliasToBean<entities.PartsPerHour>()); 
} 

suất SQL sau đây:

SELECT DateAdd(mm,1,dateTimeColumn), count(*) 
FROM [PartData] 
GROUP BY DateAdd(mm,1,dateTimeColumn) 

Chỉ cần tìm ra cách để có được những datediff trong đó :)

Trả lời

6

Qua sức mạnh của perserverance, tôi quản lý để giành chiến thắng trận chiến này. Dưới đây là QueryOver của tôi cho các truy vấn SQL nêu trên ... Tôi tin rằng tôi đã biến một góc trong điều này NHibernate :)

Bất kỳ đề xuất cải thiện hoặc thay thế cách để tái sản xuất các kết quả dự định được đánh giá rất nhiều.

private IQueryOver<entities.PartData, entities.PartData> PartPerHourQuery(ISession session) 
{ 
    return session.QueryOver<entities.PartData>() 
     .Select(
      Projections.Alias(
       Projections.GroupProperty(
        Projections.SqlFunction(
         new SQLFunctionTemplate(NHibernateUtil.DateTime, "DateAdd(minute," + 
                     new SQLFunctionTemplate(
                      NHibernateUtil.DateTime, 
                      "(DateDiff(minute, 0, Date)/1)*1") + 
                     ",0)"), 
         NHibernateUtil.DateTime, _partsDate)) 
       , "Date"), 
      Projections.Alias(Projections.RowCount(), "Count")) 
     .TransformUsing(Transformers.AliasToBean<entities.PartsPerHour>()); 
} 
+0

Tôi không nhận ra điều đó là có thể! Làm tốt! – Rippo

Các vấn đề liên quan