Это должно быть легко для гуру LINQ.
Я делаю сложный запрос, используя UNIONS
и CONTAINSTABLE
в моей базе данных, чтобы вернуть ранжированные результаты в мое приложение.
Я получаю дубликаты в моих возвращенных данных. Это ожидается. Я использую CONTAINSTABLE и CONTAINS, чтобы получить все нужные мне результаты. CONTAINSTABLE
ранжируется по SQL, а CONTAINS
(который запускается только в поле Ключевые слова) - это мой жесткий код. (Извините, если это не имеет смысла)
В любом случае, поскольку кортежи не идентичны (их ранг различен), возвращается дубликат.
Я считаю, что лучший способ справиться с этим - использовать LINQ.
Я знаю, что буду использовать метод расширения Distinct()
, но должен ли я реализовать интерфейс IEqualityComparer? Мне немного неясно, как это сделать.
Ради аргумента, скажем, мой набор результатов структурирован следующим образом:
class Content {
ContentID int //KEY
Rank int
Description String
}
Если у меня есть List<Content>
, как бы я написал метод Distinct()
для исключения Rank
? В идеале я хотел бы сохранить самый высокий рейтинг контента. Итак, если у одного Контента RAnk 112, а у другого 76. Я бы хотел сохранить рейтинг 112.
Надеюсь, я дал достаточно информации.
EDIT
Вот пример SQL для тех, у кого есть идея, как это сделать в SQL:
UNION ALL
SELECT
p.ProductID AS ContentID
, p.ProductName AS Title
, K.RANK AS Rank
, 'Product' AS ContentType
, p.AddedDateTime
FROM Products AS p
INNER JOIN CONTAINSTABLE(NaturalFactorsPIM.dbo.Products,*, @SearchPred, @TopN) AS K ON K.[KEY] = P.ProductID
WHERE @IncludeProducts = 1
AND p.ProductStatus = 1
UNION ALL
SELECT
p.ProductID AS ContentID
, p.ProductName AS Title
, 80 AS Rank
, 'Product' AS ContentType
, p.AddedDateTime
FROM Products AS p
WHERE FREETEXT( p.ProductKeywords, @SearchPred)
AND @IncludeProducts = 1
AND p.ProductStatus = 1
ORDER BY Rank DESC