Multi Aggregate function ISqlRepository extension method
sheryever opened this issue · comments
Abu Ali Muhammad Sharjeel commented
// View Name
VwEmployeeWages{
Id,
FullName,
Address,
BasicSalary,
Transport,
Inssurance,
Department,
}
// Multi aggregate call without where, groupby and having
var data = GetAggregate<VwEmployeeWages>(sqlRepository,
countOf: co => co,
sumOf: so => new { so.BasicSalary, so.Inssurance, so.Transport },
MaxOf: mo => new { mo.BasicSalary, mo.Inssurance, mo.Transport },
MinOf: mi => new { mi.BasicSalary, mi.Inssurance, mi.Transport }
);
Generated Query:
SELECT Count(*) AS CountOfAll
, SumOf(BasicSalary) AS SumOfBasicSalary, SumOf(Inssurance) AS SumOfInssurance, SumOf(Transport) AS SumOfTransport
, MaxOf(BasicSalary) AS MaxOfBasicSalary, MaxOf(Inssurance) AS MaxOfInssurance, MaxOf(Transport) AS MaxOfTransport
, MinOf(BasicSalary) AS MinOfBasicSalary, MinOf(Inssurance) AS MinOfInssurance, MinOf(Transport) AS MinOfTransport
FROM VwEmployeeWages
// Multi aggregate call without where, groupby
var data = GetAggregate<VwEmployeeWages>(sqlRepository,
countOf: co => co,
sumOf: so => new { so.BasicSalary, so.Inssurance, so.Transport },
MaxOf: mo => new { mo.BasicSalary, mo.Inssurance, mo.Transport },
MinOf: mi => new { mi.BasicSalary, mi.Inssurance, mi.Transport },
where: w => w.Id == 10,
groupBy: g => new { g.Department }
);
Generated Query:
SELECT Department, Count(*) AS CountOfAll
, SumOf(BasicSalary) AS SumOfBasicSalary, SumOf(Inssurance) AS SumOfInssurance, SumOf(Transport) AS SumOfTransport
, MaxOf(BasicSalary) AS MaxOfBasicSalary, MaxOf(Inssurance) AS MaxOfInssurance, MaxOf(Transport) AS MaxOfTransport
, MinOf(BasicSalary) AS MinOfBasicSalary, MinOf(Inssurance) AS MinOfInssurance, MinOf(Transport) AS MinOfTransport
FROM VwEmployeeWages
WHERE Id > 10
GROUP BY Department
// Multi aggregate call with where, groupby and having
var data = GetAggregate<VwEmployeeWages>(sqlRepository,
countOf: co => co,
sumOf: so => new { so.BasicSalary, so.Inssurance, so.Transport },
MaxOf: mo => new { mo.BasicSalary, mo.Inssurance, mo.Transport },
MinOf: mi => new { mi.BasicSalary, mi.Inssurance, mi.Transport },
where: w => w.Id == 10,
groupBy: g => new { g.Department },
having: hv => hv.MinOf(s => s.BasicSalary).GreaterThanEqualTo(8000)
.And().MaxOf(s => s.BasicSalary).LessThan(19999)
);
Generated Query:
SELECT Department, Count(*) AS CountOfAll
, SumOf(BasicSalary) AS SumOfBasicSalary, SumOf(Inssurance) AS SumOfInssurance, SumOf(Transport) AS SumOfTransport
, MaxOf(BasicSalary) AS MaxOfBasicSalary, MaxOf(Inssurance) AS MaxOfInssurance, MaxOf(Transport) AS MaxOfTransport
, MinOf(BasicSalary) AS MinOfBasicSalary, MinOf(Inssurance) AS MinOfInssurance, MinOf(Transport) AS MinOfTransport
FROM VwEmployeeWages
WHERE Id > 10
GROUP BY Department
HAVING MinOf(BasicSalary) >= 8000 AND MaxOf(BasicSalary) < 19999
Abu Ali Muhammad Sharjeel commented
The second proposal because first one do not allow user to name the fields and looks more c#
var data = SqlRepository.GetAggregateWithGroupBy<Employee>(
aggregator: (ag, p) => new {
SumOfBasicSalary = ag.Sum(p.BasicSalary), SumOfInssurance = ag.Sum(p.Inssurance), SumOfTransport = ag.Sum(p.Transport)
, MaxOfBasicSalary = ag.Max(p.BasicSalary), MaxOfInssurance = ag.Max(p.Inssurance), MaxOfTransport = ag.Max(p.Transport)
, MinOfBasicSalary = ag.Min(p.BasicSalary), MinOfInssurance = ag.Min(p.Inssurance), MinOfTransport = ag.Min(p.Transport)
},
where: w => w.Id > 2,
groupBy: g => new { g.Department },
having: (hv, s) => hv.Min(s.BasicSalary) >= 2000
&& hv.Max(s.BasicSalary) < 9000
);
Generated Query:
SELECT Department
, Sum(BasicSalary) AS SumOfBasicSalary, Sum(Inssurance) AS SumOfInssurance, Sum(Transport) AS SumOfTransport
, Max(BasicSalary) AS MaxOfBasicSalary, Max(Inssurance) AS MaxOfInssurance, Max(Transport) AS MaxOfTransport
, Min(BasicSalary) AS MinOfBasicSalary, Min(Inssurance) AS MinOfInssurance, Min(Transport) AS MinOfTransport
FROM VwEmployeeWages
WHERE Id > 10
GROUP BY Department
HAVING MinOf(BasicSalary) >= 8000 AND MaxOf(BasicSalary) < 19999
Abu Ali Muhammad Sharjeel commented
Implemented