Huma Ali
Huma Ali

Reputation: 1809

OrderBy using WHERE in LINQ

I have a List offerList of type Offer

public class Offer
{
    public List<Feature> FeatureList { get; set; }

}

public class Feature
{
    public string FeatureName { get; set; }
    public string Value { get; set; }
}

Now I'm trying to get the Offer and whose FeatureName is "Int" with max max of the property Value . I tried the following LINQ but it gives error

Offer' does not contain a definition for 'Value' and no extension method 'Value' accepting a first argument of type 'Offer' could be found (are you missing a using directive or an assembly reference?)

List<Offer> offerList = resp;
Offer filteredOffer = offerList
    .Where(x => x.VerticalType == VerticalType.HighSpeedInternet)
    .Where(x => x.FeatureList.Any(y => y.FeatureName == "INT"))
    .OrderByDescending(y => y.Value)
    .FirstOrDefault();

What am I missing?

Upvotes: 1

Views: 199

Answers (3)

Liviu Boboia
Liviu Boboia

Reputation: 1754

List<Offer> offerList = resp;
Offer filteredOffer = offerList
    .Where(x => x.VerticalType == VerticalType.HighSpeedInternet)
    .Where(x => x.FeatureList.Any(y => y.FeatureName == "INT"))
    .OrderByDescending(y => y.FeatureList.Where(x => x.FeatureName == "INT").Max(u => u.Value))
    .FirstOrDefault();

Upvotes: 2

Tim Schmelter
Tim Schmelter

Reputation: 460278

Presuming that the inner FeatureList contains objects with a property Value and you expect that only one object has the desired FeatureName and you want to order by it's Value:

List<Offer> offerList = resp
   .Where(x => x.VerticalType == VerticalType.HighSpeedInternet)
   .Select(x => new 
   {
       Offer = x,   
       SpeedFeature = x.FeatureList
           .Where(y => y.FeatureName == "INT")
           .OrderByDescending(y => y.Value)
           .FirstOrDefault()
   })
   .Where(x => x.SpeedFeature != null)
   .OrderByDescending(x => x.SpeedFeature.Value)
   .Select(x => x.Offer)
   .ToList();

If you want the single Offer with the highest value replace ToList with FirstOrDefault.

Upvotes: 3

caesay
caesay

Reputation: 17233

I suspect this is what you're after:

List<Offer> offerList = resp;
var filteredQuery = from offer in offerList
                    where offer.VerticalType == VerticalType.HighSpeedInternet
                    from feature in offer.FeatureList
                    where feature.FeatureName == "INT"
                    orderby feature.Value desc
                    select new { offer, feature };

Offer filteredOffer = filteredQuery.FirstOrDefault()?.offer;

It will search for the single highest valued INT feature and return the feature and offer to which it belongs.

Upvotes: 1

Related Questions