ediblecode
ediblecode

Reputation: 11971

Any way for linq query to check against existing select?

I have an an offer, that can be in any number of categories. I don't however want that offer to then appear twice or however more.

I was wondering if its possible to have a where clause that ascertains whether that offer already exists in that select statement and if so obviously to ignore it.

Here is the linq query:

Offers = from o in offerCategories
         orderby o.RewardCategory.Ordering, o.Order  
         where o.RewardOffer.IsDeleted == false
         select new OfferOverviewViewModel
         {
             Partner = o.RewardOffer.Partner,
             Description = String.Format("{0} {1}", o.RewardOffer.MainTitle, o.RewardOffer.SecondaryTitle),
             OfferId = o.OfferId,
             FeaturedOffer = o.RewardOffer.FeaturedOfferOrder.HasValue,
             Categories = from c in offerCategories.Where(oc => oc.OfferId == o.OfferId)
                          orderby c.RewardCategory.Ordering
                          select new CategoryDetailViewModel
                          {
                              Description = c.RewardCategory.DisplayName
                          }

         },

Upvotes: 0

Views: 87

Answers (1)

onof
onof

Reputation: 17367

You could use Distinct(), but your viewmodel should override Equals, or you need an EqualityComparer:

public class OfferEqualityComparer: IEqualityComparer<OfferOverviewViewModel> {

   public bool Equals(OfferOverviewViewModel x, OfferOverviewViewModel y) {
      return Equals(x.OfferId, y.OfferId);
   }

   public int GetHashCode(OfferOverviewViewModel x) {
      return x.OfferId.GetHashCode();
   }

}

Offers = (from o in offerCategories
                     orderby o.RewardCategory.Ordering, o.Order  
                     where o.RewardOffer.IsDeleted == false
                     select new OfferOverviewViewModel
                     {
                         Partner = o.RewardOffer.Partner,
                         Description = String.Format("{0} {1}", o.RewardOffer.MainTitle, o.RewardOffer.SecondaryTitle),
                         OfferId = o.OfferId,
                         FeaturedOffer = o.RewardOffer.FeaturedOfferOrder.HasValue,
                         Categories = from c in offerCategories.Where(oc => oc.OfferId == o.OfferId)
                                      orderby c.RewardCategory.Ordering
                                      select new CategoryDetailViewModel
                                      {
                                          Description = c.RewardCategory.DisplayName
                                      }

                     })
   .Distinct(new OfferEqualityComparer());

Upvotes: 2

Related Questions