0

任意の数のカテゴリに含めることができるオファーがあります。ただし、そのオファーが 2 回以上表示されることは望ましくありません。

そのオファーがその select ステートメントに既に存在するかどうかを確認する where 句を持つことが可能かどうか、もしそうなら明らかにそれを無視することができるかどうか疑問に思っていました。

linq クエリは次のとおりです。

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
                          }

         },
4

1 に答える 1

2

Distinct()を使用することもできますが、ビューモデルはEqualsをオーバーライドする必要があります。そうでない場合は、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());
于 2012-06-20T09:33:43.327 に答える