Я рассмотрел много вопросов и ответов здесь, но, похоже, не нашел, что мне нужно. У меня есть следующий sql, ниже которого у меня возникают реальные проблемы с получением инструкции LINQ. Конкретная проблема заключается в том, что для одного из полей я использую оператор CASE, как в select, так и в имеет часть предложения HAVING. Различные причины, по которым мне нужно было это сделать, но я не могу воспроизвести его в LINQ.Как использовать предложение having в агрегате в сложной группе по запросу и присоединению в LINQ
Вот SQL:
select Count (DetailID) as MonthCount , StoreID, DetailID, SUM(Amount) as AnnualAmount, PAYear, MIN(CASE when ExportFlag = 'SUCCESS' then 1 when ExportFlag is NULL or ExportFlag = '' then 0 else - 1 end) as ExpFlag
from Input_Financials
inner join DestinationDetail cdd on cdd .ID = Financials.DetailID
group by StoreID, DetailID, PAYear
Having MIN (CASE when ExportFlag = 'SUCCESS' then 1 when ExportFlag is NULL then 0 else -1 end) = 0
and Count (*) >= 1
order by PAYear
Это была моя лучшая попытка LINQ Постулаты, но вы заметите, что я не имею эквивалентную от имеющего положение, которое агрегирует значение ExportFlag (что очень важно)
var query =
from inf in inputActs
join cgrdets in cgrDetails on inf.DestinationDetailID equals cgrdets.ID
let export = (inf.ExportFlag == "SUCCESS" ? 2:
inf.ExportFlag == "ERROR" ? 1:
inf.ExportFlag == null ? 0: 99)
group inf by new {export, inf.StoreID, inf.DestinationDetailID,inf.PAYr } into g
where g.Key.export == 0
select new { MonthCount = g.Count(), g.Key.StoreID, g.Key.PAYr, Amount = g.Sum(inf=>inf.Amount) };
Кстати, пожалуйста, проигнорируйте некоторые незначительные несоответствия, которые вы можете найти в названии полей между этими двумя - это просто потому, что я быстро переименовал их ради этого вопроса.
'HAVING' в SQL будет просто' Where', что вы звоните после 'GroupBy' в LINQ ... – Servy