nerdperson
nerdperson

Reputation: 297

C# Linq Lambda for group by multiple columns select max

I want to translate this into lambda syntax and can't seem to get it to work:

Grouping by two columns, select max on a different column, return list of complete complex object.

I am writing more text here to get past the validation on this form. How much text is needed until I am allowed to post this?

_clientpolicies = (from policy in
    _reply.CommercialInsuredGroupWithPolicyTerm.InsuredWithPolicyTerm.SelectMany(x => x.PolicyTerm)
        .Where(x => !(string.IsNullOrWhiteSpace(x.PolicyNumber) && string.IsNullOrWhiteSpace(x.ControlNumber)))
        .Where(x => x.Insured.DNBAccountNumber == _client.LookupID)
          group policy by
          new
          {
              PolicyReference = GetPolicyReference(policy),
              PolicyType = policy.ProductInformation.PolicyTypeCode
          }
          into g
          let maxPolicyInception = g.Max(p => p.InceptionDate)
          from policyGroup in g
          where policyGroup.InceptionDate == maxPolicyInception
          select policyGroup).ToList();

Upvotes: 0

Views: 2949

Answers (2)

nerdperson
nerdperson

Reputation: 297

_clientpolicies =
                _reply.CommercialInsuredGroupWithPolicyTerm.InsuredWithPolicyTerm.SelectMany(x => x.PolicyTerm)
                    .Where(x => !(string.IsNullOrWhiteSpace(x.PolicyNumber) && string.IsNullOrWhiteSpace(x.ControlNumber)))
                    .Where(x => x.Insured.DNBAccountNumber == _client.LookupID)
                    .GroupBy(x => 
                        new
                        {
                            PolicyReference = GetPolicyReference(x),
                            PolicyType = x.ProductInformation.PolicyTypeCode
                        },
                        (key, g) => g.OrderByDescending(gx => gx.InceptionDate).First()

Upvotes: 0

Onyx Caldin
Onyx Caldin

Reputation: 299

I dont think there's a way of doing it in one line. So there's my try :

policyGroups= 
     _reply.CommercialInsuredGroupWithPolicyTerm.InsuredWithPolicyTerm
                .SelectMany(x => x.PolicyTerm)
                .Where(x => !(string.IsNullOrWhiteSpace(x.PolicyNumber) && string.IsNullOrWhiteSpace(x.ControlNumber)))
                .Where(x => x.Insured.DNBAccountNumber == _client.LookupID)
                .GroupBy(x => GetPolicyReference(x))
                .ThenBy(x => x.ProductInformation.PolicyTypeCode)
                .ToList();

var maxPolicyInception = policyGroups.Max(p => p.InceptionDate);
_clientpolicies = policyGroups
                 .Where(g => g.InceptionDate == maxPolicyInception)
                 .ToList();

Upvotes: 1

Related Questions