简体   繁体   中英

How to get the group sum in my complex linq query

below I have listed a linq query that works properly in my asp.net.mvc web app.
In addition I would like to group over 'allowance.ParameterId' in order to get the group sum for 'allowance.Freight (instead of multiple records for the given key).

            var query = from ara in aras
                    join company in companies on ara.Id equals company.ARAId
                    join wasteWater in wasteWaters on company.Id equals wasteWater.CompanyId
                    join allowance in allowances on wasteWater.Id equals allowance.WasteWaterID
                    join parameter in parameters on allowance.ParameterId equals parameter.Id into JoinedParameterAllowance
                    from parameter in JoinedParameterAllowance.DefaultIfEmpty()

                    where company.Activ == true && company.End == null && company.Template == false
                    && wasteWater.End == null

                    select new FreightSummaryViewModel
                     {
                         AraName = ara.Name,
                         AraId = ara.Id,
                         AllowedParameter = parameter.Name,
                         AllowedFreight = allowance.Freight
                    };

I have tried to insert 'group ...' but failed to get it right. Could someone help me please to set up the proper syntax? Thank you in advance, Manu

I have little idea about relations in your database, so I improvised...

// Some dummy data to play with
var aras        = Enumerable.Range(0,  5).Select(i => new { Id = i, Name = "Ara" + i });
var companies   = Enumerable.Range(0, 15).Select(i => new { Id = i, ARAId = i % 5, Activ = true, End = (DateTime?)null, Template = false });
var wasteWaters = Enumerable.Range(0, 35).Select(i => new { Id = i, CompanyId = i / 15, End = (DateTime?)null });
var allowances  = Enumerable.Range(0, 70).Select(i => new { Id = i, WasteWaterID = i, ParameterId = i % 4, Freight = i * 1000 });
var parameters  = Enumerable.Range(0,  4).Select(i => new { Id = i, Name = "Parameter" + i });

And this is what I believe you looked for:

var query =
    from ara in aras
        join company    in companies   on ara.Id                equals company.ARAId
        join wasteWater in wasteWaters on company.Id            equals wasteWater.CompanyId
        join allowance  in allowances  on wasteWater.Id         equals allowance.WasteWaterID
        join parameter  in parameters  on allowance.ParameterId equals parameter.Id
            into JoinedParameterAllowance
//  from parameter in JoinedParameterAllowance.DefaultIfEmpty()

    where true
        && company.Activ    == true
        && company.End      == null
        && company.Template == false
        && wasteWater.End   == null

    group allowance by new
    {
        AraName     = ara.Name,
        AraId       = ara.Id,
        ParameterId = allowance.ParameterId
    } into myGroup

    select new //FreightSummaryViewModel
    {
        AraName          = myGroup.Key.AraName,
        AraId            = myGroup.Key.AraId,
        AllowedParameter = myGroup.Key.ParameterId,
        AllowedFreight   = myGroup.Sum(g => g.Freight)
    };

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM