sheryever / simple-access-orm

Simple Access ORM provides database access in Ado.net methods naming pattern

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Multi Aggregate function ISqlRepository extension method

sheryever opened this issue · comments

// 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

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