Reputation: 1809
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
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
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
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