LINQ Кроме использования пользовательского Comparer
-
06-07-2019 - |
Вопрос
Я пытаюсь использовать " кроме " метод в наборе результатов LINQ с использованием пользовательской реализации, если IEqualityComparer исключает определенные результаты на основе значения одного поля из набора результатов.
Итак, в упрощенном виде я ...
'' Get collection of published sites...
Dim List1 = (From i In db.Sites _
Where (i.StatusID = published) _
Select i.SiteID, _
i.SiteName)
'' Find those with a pending site, but exclue all those whose SiteID is in List1...
Dim insComparer = New insCompare
Dim List2 = (From i In db.Sites _
Where (i.StatusID = pending) _
Select i.SiteID, _
i.SiteName).Except(List1, insComparer)
Мой Comparer выглядит следующим образом ...
Public Class insCompare
Implements System.Collections.Generic.IEqualityComparer(Of Object)
Public Function Equals1(ByVal x As Object, ByVal y As Object) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of Object).Equals
Return IIf(x.SiteID = y.SiteID, True, False)
End Function
Public Function GetHashCode1(ByVal x As Object) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Object).GetHashCode
Return x.SiteID.ToString.ToLower.GetHashCode()
End Function
End Class
Я получаю недопустимое исключение приведения для " .Except " строка с сообщением " Невозможно привести объект типа '... insCompare' к типу 'System.Collections.Generic.IEqualityComparer' "
Кто-нибудь может пролить свет на то, почему это может быть, пожалуйста.
Решение
Ваша проблема здесь в том, что вы реализуете IEqualityComparer (Of Object), но ваши списки - это List (Of AT), где AT - анонимный тип, поэтому вы не можете реализовать IEqualityComparer (Of AT).
Я думаю, что ваш выбор:
<Ол>Другие советы
Используйте следующий код.
from t in db.Sites
where
!
(from t0 in db.Sites2
select new {
t0.SomeID
}).Contains(new { t.SomeID })
select t
это основано на не в состоянии. Я думаю, что это поможет вам. Вы делаете что-то сложное.
Похоже, он просит ваш компаратор реализовать неуниверсальный интерфейс IEqualityComparer
, тогда как ваш реализует IEqualityComparer (Of Object)
, который является другим интерфейсом. р>
Похоже, вы используете базу данных в качестве серверной части. Вы не можете предоставить для этого собственный компаратор, поскольку он не может быть сопоставлен с TSQL.
Вы пробовали содержит
? то есть где! List1.Contains (i.SiteID)
?