Linq Наследование и подтипы (хотите отфильтровать базовый тип) - PullRequest
0 голосов
/ 08 ноября 2010

ОК. У меня есть базовый запрос, который возвращает список (на самом деле ObjectQuery, но я не думаю, что это имеет значение)

У меня около 5 подтипов, основанных на основном типе, и мне нужно отфильтровать их.Все работает нормально, пока я не хочу, чтобы результаты были основного типа (не подкласса)

В основном у меня есть запрос, который включает все, затем я отфильтровываю типы, которые не отмечены в списке флажков.(asp.net)

Допустим, у меня есть объект с именем Task, а SubTask1 и SubTask2, которые наследуются от Task

       Dim AllTasks As Objects.ObjectQuery(Of Demo.Task) = dbContext.CompletedTasks(ctx, anyID)  'calling a compiled query but it doesnt matter. 
    'It could be Dim AllTasks = from t in ctx.Tasks select t

    For Each itm As ListItem In chkTaskTypeList.Items
        If Not itm.Selected Then
            Select Case itm.Value
                Case "SubTask1"
                    'this works as expected, and eliminates tasks that are of the subtype Subtask1 
                    AllTasks = From ti In AllTasks Where Not TypeOf ti Is SubTask1

                Case "SubTask2"
                    'This also works as I want by filtering out the various sub types
                    AllTasks = From ti In AllTasks Where Not TypeOf ti Is SubTask2 AndAlso Not TypeOf ti Is SubTaskWhatever

                Case "SubTask"
                    **'This works as expected, but not like I need. It removes all the types when what I really want is to remove** 
                    **'The results that are of the base type but NOT the ones that are of a subtype**
                    AllTasks = From ti In AllTasks Where Not TypeOf ti Is SubTask

            End Select
        End If
    Next

    lvwHistory.DataSource = AllTasks

Если бы у меня было ограниченное количество подтипов, я, вероятно, мог бы что-то сказатькак (не TypeOf ti Is SubTask и также TypeOf ti Is SubTask1) andalso ... но я надеюсь на лучший способ (и тот, который не ломает страницу, если добавлен новый подтип)

Ответы [ 2 ]

0 голосов
/ 08 ноября 2010

Это ()"> сложно, но возможно .Тем не менее, вы должны переосмыслить свой дизайн.Это обычно нарушает принцип подстановки Лискова.

0 голосов
/ 08 ноября 2010

Вы должны сравнить, если типы равны

OnlyBaseClasses = From ti In AllTasks Where ti.GetType() = GetType(TheBaseClass)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...