Попытка получить Distinct () и / или GroupBy (...) в возвращенном ToList - PullRequest
2 голосов
/ 19 ноября 2011

Код работает и возвращает хороший список с (6) элементами. Однако мы видим дубликаты productSKU. Мы хотим сделать ОТЛИЧИЕ ПРОДУКТА SKU.

pM = (from oo in ctx.option1 
      where mArray.Contains(oo.option1Code)
      select oo)
      .Select(o => new ProductMatch
    {
        productSKU = o.option1Code,
        productPrice = o.price,
        option1Desc = o.option1Desc
    }).ToList();

Я пытался добавить Distinct () после лямбды, но я все еще получаю (6) предметов.

Я также получаю сообщение об ошибке при добавлении GroupBy (...) «Невозможно преобразовать лямбда-выражение в тип« строка », потому что это не тип делегата»

Ответы [ 3 ]

4 голосов
/ 19 ноября 2011

Попробуйте этот синтаксис:

pM = (from o in ctx.option1 
      where mArray.Contains(o.option1Code)
      let t = new 
      {
         productSKU = o.option1Code,
         productPrice = o.price,
         option1Desc = o.option1Desc
      }
      group o by t into grp
      select new ProductMatch
      {
         productSKU = grp.Key.option1Code,
         productPrice = grp.Key.price,
         option1Desc = grp.Key.option1Desc
      }).ToList();
1 голос
/ 19 ноября 2011

Когда вы используете Distinct в выражении lamba, Distinct смотрит только на EntityKey для отдельного сравнения. Вам нужно будет реализовать свой собственный IEqualityComparer для вашего выбора.

internal class UniqueProductComparer : IEqualityComparer<ProductMatch>
{
    public bool Equals(ProductMatch x, ProductMatch y)
    {
        if(Object.ReferenceEquals(x,y)) return true;

        if(Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y,null))
           return false;

        return x.productSKU == y.ProductSKU && x.productPrice == y.productPrice && x.option1Desc == y.option1Desc;
     }

     public int GetHashCode(ProductMatch match)
     {
        if (Object.ReferenceEquals(match,null)) return 0;

        return match.productSKU.GetHashChode() + match.productPrice.GetHashCode() + match.option1Desc.GetHashCode();
     }
}

Тогда в вашей ламбе измените это на:

pM = (from oo in ctx.option1 
      where mArray.Contains(oo.option1Code)
      select oo)
     .Select(o => new ProductMatch
    {
        productSKU = o.option1Code,
        productPrice = o.price,
        option1Desc = o.option1Desc
    }).Distinct(new UniqueProductComparer()).ToList();
1 голос
/ 19 ноября 2011

Небольшая вариация ответа IAbstractDownvoteFactor

pM = (from oo in ctx.option1 
      where mArray.Contains(oo.option1Code)
      select oo)
      .GroupBy(o => o.option1Code)
      .Select(g => g.First())
      .Select(o => new ProductMatch
    {
        productSKU = o.option1Code,
        productPrice = o.price,
        option1Desc = o.option1Desc
    }).ToList();

В качестве альтернативы, если вы интенсивно используете linq и открыты для использования библиотек, существует morelinq , который дает вам расширение DistinctBy() и несколькодругие полезные расширения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...