2008-11-03 6 views
5

Ich habe ein Visual Basic WPF-Anwendungsprojekt erstellt, das Toy.edmx enthält, ein ADO.NET-Entitätsdatenmodell, das aus einer Datenbank mit dem Namen Toy generiert wird.Wie erweitere ich ADO.NET Entity Framework-Objekte mit Teilklassen?

Seine Window1.xaml.vb Datei sieht wie folgt aus:

 
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 

Das ganz gut läuft.

Aber, wenn ich hinzufügen, um die Datei Client.vb ...

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

... und fügen Sie eine WHERE-Klausel meiner Window1.xaml.vb Abfrage ...

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

... dann bekomme ich diese NotSupportedException:

LINQ to Entiti Es erkennt die Methode 'Boolean IsWashington()' nicht und diese Methode kann nicht in einen Speicherausdruck übersetzt werden.

Wie erweitere ich ADO.NET Entity Framework-Objekte mit partiellen Klassen?

Antwort

2

Das Problem ist, dass Sie Code schreiben und erwarten, dass das Entity Framework das in SQL übersetzt ... das geht nicht. Genauso wenig wie LINQ to SQL.

Stellen Sie sich vor, wenn Ihr Eigentum eine Datei vom Laufwerk "C: \" liest ... wie denken Sie, dass es damit umgehen würde? - nicht möglich.

+0

Ich hoffe, dass das nicht zu hart klang ... was ich sagen sollte ist, dass, sobald Sie Abfrage "lokal" sind, Sie Ihre WHERE-Klausel hinzufügen können (aber das ist LINQ zu Objekten - und das ist lokal, nicht in der DB Niveau). –

1

Welcher Typ ist Client-Klasse?

Möglicherweise müssen Sie der Datei, die "IsWashington" enthält, einen Namespace hinzufügen (derselbe wie der, in dem Client "Entity classes" definiert ist).

+0

Was ist falsch an meiner Antwort? Wie haben Sie das Problem gelöst? Danke. – shahkalpesh

3

Versuchen Sie, eine Methode zu erstellen, die einen Filter auf Clientabfragen anwendet.

Ich weiß nicht vb.net, also nicht diesem Freihand-Code 100% vertrauen.

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 

später, einige aufrufende code.

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

Label1.Content = someQuery.First.FirstName 

Hoffe, das funktioniert!

+0

Sie können einen Blogeintrag mit einer ziemlich ausführlichen Erklärung des Problems hier finden: http://blog.genom-e.com/PermaLink,guid4c486a95-12ad-4abf-aba1-7eb893c91ba7.aspx – csgero

1

Sie könnten dieses spezielle Problem umgehen, indem Sie Ihr Client-Objekt aus einer Ansicht füttern. Verwenden Sie die SQL-CASE-Anweisung ein wenig Spalte Wert zu setzen:

SELECT col1, col2, col3, Nachname CASE Name VZ WHEN 'Washington' THEN 1 ELSE 0 AS IsWashington vom Client

Wenn Sie die Verwendung Als Grundlage für Ihr Client-Entitätsobjekt sollte die IsWashington-Spalte zusammen mit allen anderen Spalten ein Mitglied der Klasse werden.

1

shahkalpesh ist korrekt, Sie müssen den Namespace um Ihre erweiterte Klasse hinzufügen, damit sie mit dem generierten übereinstimmt.

Verwandte Themen