Ошибка в Linq: текстовый тип данных не может быть выбран как DISTINCT, потому что он не сопоставим - PullRequest
0 голосов
/ 19 марта 2012

У меня проблема с LINQ. В основном, сторонняя база данных, к которой мне нужно подключиться, использует устаревшее текстовое поле (я не могу это изменить), и мне нужно выполнить отдельное предложение в моем linq для результатов, которые содержат это поле.

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

В любом случае запрос ниже:

        var query = (from s in db.tSearches
                     join sc in db.tSearchIndexes on s.GUID equals sc.CPSGUID
                     join a in db.tAttributes on sc.AttributeGUID equals a.GUID
                     where s.Notes != null && a.Attribute == "Featured" 
                     select new FeaturedVacancy
                     {
                         Id = s.GUID,
                         DateOpened = s.DateOpened,
                         Notes = s.Notes
                     });
        return query.Distinct().OrderByDescending(x => x.DateOpened);

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

1 Ответ

0 голосов
/ 26 марта 2012

Нет ответов о том, как это сделать, поэтому я пошел со своим первым предложением и сначала извлек уникальные записи из tSearch, затем построил подзапрос с неуникальными записями и отфильтровал результаты поиска по этому подзапросу. Ответ ниже:

        var query = (from s in db.tSearches
                     where s.DateClosed == null && s.ConfidentialNotes != null
                     orderby s.DateOpened descending
                     select new FeaturedVacancy
                     {
                         Id = s.GUID,
                         Notes = s.ConfidentialNotes
                     });

        /* Now filter by our 'Featured' attribute */
        var subQuery = from sc in db.tSearchIndexes
                       join a in db.tAttributes on sc.AttributeGUID equals a.GUID
                       where a.Attribute == "Featured"
                       select sc.CPSGUID;

        query = query.Where(x => subQuery.Contains(x.Id));

        return query;
...