2008-11-03 3 views
5

Я создал проект приложения Visual Basic WPF, который содержит Toy.edmx, модель данных сущностей ADO.NET, сгенерированную из базы данных под названием Toy.Как расширить объекты Entity Framework 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 

... и добавить ИНЕКЕ к моему 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 не распознает метод «Boolean IsWashington()», и этот метод не может быть переведен в выражение хранилища.

Как расширить объекты Entity Framework ADO.NET с частичными классами?

ответ

2

Проблема в том, что вы пишете код и ожидаете, что Entity Framework переводит это в SQL ... он не может этого сделать. Точно так же, как LINQ to SQL не может этого сделать.

Представьте, если ваше свойство прочитало файл с диска «C: \» ... как вы думаете, что это сработает? - невозможно.

+0

Надеюсь, это не звучит слишком суровым ... я должен сказать, что после запроса «local» вы можете добавить предложение where (но это LINQ to Objects), и это локально, а не в 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

Вы можете обойти эту проблему, подав объект Client из представления. Используйте оператор SQL CASE, чтобы установить значение бита столбца:

SELECT col1, col2, col3, LastName СЛУЧАЙ LastName КОГДА 'Вашингтон' THEN 1 ELSE 0 AS IsWashington от клиента

Если вы используете как основу для объекта объекта клиента, столбец IsWashington должен стать членом класса вместе со всеми остальными столбцами.

1

shahkalpesh правильно, вам нужно добавить пространство имен вокруг вашего расширенного класса в соответствии с созданным.