2013-09-24 3 views
1

Im, использующий MEF и выполняющий задачу, которая должна быть сгруппирована с агрегатными функциями только тогда, когда она возвращает более 1 записи. Мне нужно как Макса из стартового час и мин конечного часа группируют в одной записи, как мой SQL приведет на restuled задачиПреобразование инструкции SQL в запрос Linq/Lambda

var ohs = await Bl.UoW.Repositories.OperatingHours 
    .FindInDataSourceAsync(oh => ((oh.ProductId == productTypeId 
     && oh.StateId == state) 
     || (oh.StateId == complianceHours.State))); 

Вот это SQL, который получает меня basiccally то, что мне нужно, когда более чем на 1 запись вернулся

SELECT 
    StateId, 
    MAX(ComplianceHourStart), 
    MIN(ComplianceHourEnd) 
FROM 
    OperatingHours 
GROUP BY 
    StateId 
HAVING 
    StateId = 'CA' 

Так что, когда более чем 1 я могу фильтровать его дальше, но не знаете, как достичь максимальной и минимальной?

if (ohs != null && ohs.Count() > 1) 
{ 
    // 
    ohs = ohs.GroupBy(x => x.State).Max(x => x.ComplianceHourStart?... 

} 

Благодаря

ответ

1

От вашего SQL, это должно быть близко:

var result = context.OperatingHours 
        .GroupBy(oh => oh.StateId) 
        .Select(oh => new {StateId = oh.Key, 
             MaxStart = oh.Max(x => x.ComplianceHourStart), 
             MinEnd = oh.Min(x => x.ComplianceHourEnd)}); 

... хотя я не что вы группируете, когда вы ограничиваете столбец идентификатора состояния (групповой ключ). Также должно быть достаточно:

var result = context.OperatingHours 
        .Where(oh => oh.StateId == 'CA') 
        .Select(oh => new {MaxStart = oh.Max(x => x.ComplianceHourStart), 
             MinEnd = oh.Min(x => x.ComplianceHourEnd)}); 
+0

Спасибо! Работает. Я понимаю, как это работает сейчас :) – RobDog888

1

Что-то вроде этого следует сделать это:

ohs = ohs.GroupBy(x => x.State) 
    .Select(g => new 
    { 
     //You need to make a choice on StateId, here... First one? 
     StateId = g.First().StateId, 
     MaxComplianceHourStart = g.Max(o => o.ComplianceHourStart), 
     MinComplianceHourEnd = g.Min(o => o.ComplianceHourEnd) 
    }); 
Смежные вопросы