2012-06-29 97 views
1

我有幾個類從基類繼承和多態

Public MustInherit Class BaseClass 
    Public Property Name as String 
End Class 

Public MustInherit Class ClassA 
    Inherits BaseClass 
    Public Property Something As String 
End Class 

Public MustInherit Class ClassB 
    Inherits BaseClass 
    Public Property SomethingElse As String 
End Class 

我希望能夠使用單個表達式查詢對象的多個列表,所有這些都繼承繼承從同一個基類

Public Function DoStuff(Expression as System.Linq.Expressions.Expression(Of Func(Of BaseClass, Boolean))) 
    Dim ListA As New List(Of ClassA) ''Populating this elsewhere 
    Dim ListB As New List(Of ClassB) ''and this 

    Dim ResultSetA = ListA.Where(Expression) ''Problems on this line 
    Dim ResultSetB = ListA.Where(Expression) ''and this 
End Function 

由於兩個ClassA,並從同一個基類繼承ClassB,由於LINQ查詢是針對基類,它應該工作。該Expression只能參考該保證是存在於兩個派生類的基類的屬性,但我得到以下編譯時輸入錯誤:

Value of type 'System.Linq.Expressions.Expression(Of System.Func(Of BaseClass, Boolean))' cannot be converted to 'System.Linq.Expressions.Expression(Of System.Func(Of ClassA, Boolean))' 

有什麼辦法,我可以添加一個擴大轉換(或類似的東西),讓這個工作?

或者我需要提供完全相同的查詢多次針對每個派生類?

+0

原來的類型,我認爲你需要的LINQ的演員之前的地方是,但是我不知道VB的語法。我猜它可能是.Cast(Of BaseClass)? – podiluska

+0

你是不是要傳遞'Func'而不是'Expression'? – Henry

+0

@HenryP其實,沒有。我已經簡化了上面的例子,因爲我實際上是針對Db中的實體運行的,列表是存儲庫,並且我還有其他一些動態修改表達式樹的事情。所討論的Baseclass是一個通用的'Job'基礎,代表作業的所有實體都繼承自 – Basic

回答

3

您需要AsQueryable()列表(C#下面語法)

var ResultA = lista.AsQueryable().Where(expression); 

你可以再投,結果回來,如果你需要

foreach (var x in ResultA) 
{ 
     Response.Write(((ClassA)x).Something); 
} 
+0

良好的漁獲物 - 實際上,通過使'IQueryable'並使用@ HenryP的編譯查詢的建議,我可以不用轉換....'ListA.AsQueryable.Where(Expression.Compile)'。謝謝! – Basic