2008-11-03 50 views
5

我創建了一個包含Toy.edmx的Visual Basic WPF應用程序項目,這是一個從名爲Toy的數據庫生成的ADO.NET實體數據模型。如何用部分類擴展ADO.NET實體框架對象?

Window1.xaml.vb文件看起來像這樣:

 
1 Class Window1 
2 
3  Private Sub Window1_Loaded(_ 
4  ByVal sender As System.Object, _ 
5  ByVal e As System.Windows.RoutedEventArgs) _ 
6  Handles MyBase.Loaded 
7 
8   Dim dc As New ToyEntities1 
9   Label1.Content = (From c As Client In dc.ClientSet _ 
10       Select c).First.FirstName 
11 
12  End Sub 
13 
14 End Class 

運行就好了。

但是,如果我添加文件Client.vb ...

 
1 Partial Public Class Client 
2  Function IsWashington() As Boolean 
3   Return Me.LastName = "Washington" 
4  End Function 
5 End Class 

...和WHERE子句添加到我的Window1.xaml.vb查詢...

 
9   Label1.Content = (From c As Client In dc.ClientSet _ 
10       Where c.IsWashington _ 
11       Select c).First.FirstName 

...然後我得到這個NotSupportedException異常:

LINQ到Entiti es無法識別方法'布爾IsWashington()'方法,並且此方法無法轉換爲商店表達式。

如何擴展帶有部分類的ADO.NET實體框架對象?

回答

2

問題是,你正在編寫代碼,並期望實體框架將其轉換成SQL ......它不能這樣做。就像LINQ to SQL不能那樣做。

想象一下,如果您的財產從「C:\」驅動器中讀取文件,您認爲它會如何處理? - 不可能。

+0

我希望聽起來不太刺耳......我應該說的是,一旦你查詢的是「本地」,你可以添加你的where子句(但這是LINQ到對象 - 這是本地的,而不是在DB水平)。 – 2008-11-04 01:41:50

1

客戶端類是什麼類型?

您可能需要將名稱空間(與定義客戶端「實體類」相同)添加到包含「IsWashington」的文件中。

+0

我的回答有什麼問題? 你是如何解決這個問題的? 謝謝。 – shahkalpesh 2008-11-04 22:41:42

3

這是你要做的 - 創建一個方法,將過濾器應用到客戶端查詢。

我不知道vb.net,所以不要相信這個自由代碼100%。

Partial Public Class Client 
    Public Shared Function IsWashington(query As IQueryable(Of Client)) As IQueryable(Of Client) 
    Return query.Where(Function(someClient) someClient.LastName = "Washington") 
    End Function 
End Class 

後來,一些調用代碼。

IQueryable(Of Client) someQuery = dc.ClientSet.AsQueryable 
someQuery = Client.IsWashington(someQuery) 

Label1.Content = someQuery.First.FirstName 

希望這個作品!

+0

你可以在這裏找到一篇相當詳細的問題解釋的博客文章:http://blog.genom-e.com/PermaLink,guid,4c486a95-12ad-4abf-aba1-7eb893c91ba7.aspx – csgero 2008-11-04 07:33:42

1

您可以通過從View中提供Client對象來解決此特定問題。使用SQL CASE語句來設置一個位列值:

SELECT COL1,COL2,COL3,姓氏 CASE姓氏 如果 '華盛頓' THEN 1 ELSE 0 AS IsWashington 從客戶

如果使用視圖作爲Client實體對象的基礎,IsWashington列應該成爲該類的成員以及所有其他列。

1

shahkalpesh是正確的,你需要在你的擴展類中添加命名空間來匹配生成的類。