2009-07-10 4 views
13

Что равным ниже SQL в LINQLinq (MIN MAX &&)

select MIN(finishTimestamp) AS FromDate, MAX(finishTimeStamp) AS ToDate From Transactions 

??

from t in Transactions 
select new { 
      FromDate = ?, 
      ToDate = ? 
     } 

Благодаря

ответ

18

Вы можете просто сделать

var transactionDates = from t in Transactions 
         select t.FinishTimeStamp; 

var dates = new { 
        FromDate = transactionDates.Min(), 
        ToDate = transactionDates.Max() 
       }; 
0

Вы также можете использовать агрегатные функции, если вы хотите (пример в VB)

Dim max = Aggregate tMax In Transactions Select tMax Into Max() 
36

Чтобы использовать несколько агрегатов в Linq to SQL, по таблице, без группировки, единственная способ я нашел, чтобы избежать делать несколько запросов, чтобы сделать «поддельного группу»:

var q = from tr in dataContext.Transactions 
     group tr by 1 into g // Notice here, grouping by a constant value 
     select new 
     { 
      FromDate = g.Min(t => t.InvoiceDate), 
      ToDate = g.Max(t => t.InvoiceDate) 
     }; 

Любопытным Hacky, но сгенерированный SQL чист, и, делая это, вы делаете только один запрос к базы данных.

+0

+1 интересный! – womp

+0

, чтобы сообщать вам об этом: "group by 1" не работает с NHibernate 3.2 – devio