получить всю строку, используя отдельные в одном столбце в LINQ

Мне нужно получить всю коллекцию строк, используя distinct в одном столбце в LINQ.

я получаю Distinct с помощью GroupBy, но он выбирает только значения одного столбца, вместо этого мне нужна вся строка.

** этот список возвращает коллекцию, которая уникальна в столбце ThumbnailAltText, НО возвращает только этот столбец, а не значения всей строки. поэтому мне пришлось использовать var вместо type

 var catlist = _db.ac_Categories
    .Where(c => c.VisibilityId == 0 && c.ThumbnailAltText != null
        && (!c.ThumbnailAltText.StartsWith("gifts/")
        && !c.ThumbnailAltText.StartsWith("email/")
        && !c.ThumbnailAltText.StartsWith("news/")
        && !c.ThumbnailAltText.StartsWith("promotions/")
        && !c.ThumbnailAltText.StartsWith("the-knowledge/"))).ToList()
        .GroupBy(c=> c.ThumbnailAltText.Trim().Distinct()).ToList();
                                .GroupBy(c=> c.ThumbnailAltText.Trim().Distinct()).ToList();

то же самое не работает с type подобным образом, и я получаю сообщение об ошибке.

List<ac_Categories> catlist = _db.ac_Categories
        .Where(c => c.VisibilityId == 0 && c.ThumbnailAltText != null
            && (!c.ThumbnailAltText.StartsWith("gifts/")
            && !c.ThumbnailAltText.StartsWith("email/")
            && !c.ThumbnailAltText.StartsWith("news/")
            && !c.ThumbnailAltText.StartsWith("promotions/")
            && !c.ThumbnailAltText.StartsWith("the-knowledge/"))).ToList()
            .GroupBy(c=> c.ThumbnailAltText.Trim().Distinct()).ToList();
                                    .GroupBy(c=> c.ThumbnailAltText.Trim().Distinct()).ToList();

ОШИБКА: The 'Distinct' operation cannot be applied to the collection ResultType of the specified argument.

EDIT: мне нужна коллекция, а не первая запись, идентификатор и другие столбцы содержат только значения различий ThumbnailAltText, которые содержат дубликаты


person patel.milanb    schedule 17.10.2013    source источник
comment
Не могли бы вы предоставить определение типа ac_Categories   -  person zabulus    schedule 17.10.2013
comment
это объект, созданный с использованием первого подхода к базе данных... это очень большая таблица, поэтому не могу предоставить ее здесь...   -  person patel.milanb    schedule 17.10.2013


Ответы (2)


Distinct в строке возвращает уникальные символы. Я предполагаю, что вы хотите вернуть все строки, но каждая строка должна быть уникальной в соответствии с ThumbnailAltText, это правильно?

Тогда это должно работать, оно просто возвращает первую строку каждой группы:

var catlist = _db.ac_Categories
    .Where(c => c.VisibilityId == 0 && c.ThumbnailAltText != null
        && (!c.ThumbnailAltText.StartsWith("gifts/")
        && !c.ThumbnailAltText.StartsWith("email/")
        && !c.ThumbnailAltText.StartsWith("news/")
        && !c.ThumbnailAltText.StartsWith("promotions/")
        && !c.ThumbnailAltText.StartsWith("the-knowledge/")))
     .GroupBy(c=> c.ThumbnailAltText.Trim())
     .ToList()
     .Select(g => g.First())
     .ToList();
person Tim Schmelter    schedule 17.10.2013
comment
это собирается вернуть всю строку или только одно значение столбца? - person patel.milanb; 17.10.2013
comment
@patel.milanb: возвращает всю строку. - person Tim Schmelter; 17.10.2013
comment
позвольте мне попробовать и дам вам знать ... так что, если он возвращает всю строку, я могу использовать тип возвращаемого значения как List‹ac_Categories› правильно? вместо вар - person patel.milanb; 17.10.2013
comment
это дает мне ошибку: метод «Первый» может использоваться только как окончательная операция запроса. Вместо этого рассмотрите возможность использования метода «FirstOrDefault» в этом случае. - person patel.milanb; 17.10.2013
comment
@patel.milanb: Затем попробуйте добавить ToList перед Select, как вы уже сделали в своем коде (отредактировал мой ответ). - person Tim Schmelter; 17.10.2013

также вы можете использовать Distinct(IEnumerable, IEqualityComparer) такое расширение

public class CategotiesEqualityComparer : IEqualityComparer<ac_Categories>
{
    public bool Equals(ac_Categories x, ac_Categories y)
    {
        return x.ThumbnailAltText.Trim() == y.ThumbnailAltText.Trim();
    }

    public int GetHashCode(ac_Categories obj)
    {
        return obj.ThumbnailAltText.Trim().GetHashCode();
    }
}

List<ac_Categories> catlist = _db.ac_Categories
    .Where(c => c.VisibilityId == 0 && c.ThumbnailAltText != null
        && (!c.ThumbnailAltText.StartsWith("gifts/")
        && !c.ThumbnailAltText.StartsWith("email/")
        && !c.ThumbnailAltText.StartsWith("news/")
        && !c.ThumbnailAltText.StartsWith("promotions/")
        && !c.ThumbnailAltText.StartsWith("the-knowledge/")))
    .Distinct(new CategotiesEqualityComparer())
    .ToList()
person Grundy    schedule 17.10.2013
comment
Ошибка: LINQ to Entities не распознает метод «System.Linq.IQueryable1[WebMgr.ac_Categories] Distinct[ac_Categories](System.Linq.IQueryable1[WebMgr.ac_Categories], System.Collections.Generic.IEqualityComparer`1[WebMgr.ac_Categories])», и этот метод не может быть преобразован в выражение хранилища . - person patel.milanb; 17.10.2013
comment
Расширение для IEnumerable, а не IQueryable - person Grundy; 17.10.2013
comment
да... я понял... я должен использовать AsEnumerable() - person patel.milanb; 17.10.2013