El Dev Ответов: 3

Distinct не работает в коде LINQ c#


Привет,

Я получаю проблему при реализации этого кода:

public static List<SubCategoryInfo> GetPageByCategorySEOName(string PageName, string SubPageName)
   {
       return (from p in GetAllPageByCategorySEOName()
               where (p.CategorySEOName.Equals(PageName, StringComparison.OrdinalIgnoreCase) ||
                      p.SubCategorySEOName.Equals(SubPageName, StringComparison.OrdinalIgnoreCase))
                     && (p.CategorySEOName.Equals(PageName, StringComparison.OrdinalIgnoreCase) ||
                     p.SubCategorySEOName.Equals(SubPageName, StringComparison.OrdinalIgnoreCase))
                     select p).Distinct().ToList();
   }


Идея исходит из этого sql запроса который работает как и ожидалось:

select distinct  c.CategorySEOName from [dbo].[SubCategory] Sc
     inner join [dbo].[Category] C on C.CategoryId = Sc.CategoryId
     where (c.categorySEOName in('aboutus') or Sc.SubcategorySEOName in('""'))
     and ( c.categorySEOName in('aboutus') or Sc.SubcategorySEOName in('Our-values'))


sql-запрос прекрасно работает с distinct, но не для кода linq c#.

Пожалуйста, кто-нибудь может помочь мне сказать, почему distinct кода linq c# не работает, в моем случае он дублирует данные, поэтому я хочу использовать distinct как для sql-запроса, который работает нормально.

3 Ответов

Рейтинг:
24

virang_21

Попробуйте метод groupBy и чем делать выбор... Например...

List<Person> distinctPeople = allPeople
  .GroupBy(p => p.PersonId)
  .Select(g => g.First())
  .ToList();


Maciej Los

+5

Member 13767903

хорошо, это работает.

Рейтинг:
15

Mattias Högström

С помощью DISTINCT я предполагаю, что вы хотите удалить дубликаты.
Но вы делаете DISTINCT на уровне объекта в коде Linq, то есть на объекте p.
объекты сравниваются по их значению GetHashCode

В sql вы делаете Distinct on p.CategorySEOName

То, что вам нужно, - это отличное, которое принимает выражение
Но этого не существует :)

Возможно, вместо этого вы можете использовать group by.

списке "мой список".Метод groupBy(Р =&ГТ; п.CategorySEOName).Выберите(г =&ГТ; г. Первый())


Matt T Heffron

Но это мочь возьмите IEqualityComparer<T> Таким образом, простой класс EqualityComparer может быть реализовано, что сравнивается p.CategorySEOName для .Равны и использовали это для вычислений .GetHashCode() см. http://msdn.microsoft.com/en-us/library/ms132151(v=против 110).aspx

Mattias Högström

Я не работал с Linq уже пару лет.
Я смутно помню, что в те дни я использовал метод расширения, чтобы обойти его.
Хорошая находка.