Я создал проект приложения WPF на Visual Basic, который содержит Toy.edmx, модель данных сущности ADO.NET, созданную из базы данных Toy.
Его файл 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 to Entities does not recognize the method 'Boolean IsWashington()' method, and this method cannot be translated into a store expression.
Как мне расширить объекты ADO.NET Entity Framework частичными классами?





Какой тип это клиентский класс?
Возможно, вам потребуется добавить пространство имен (такое же, как то, в котором определен Client "Entity classs") в файл, содержащий "IsWashington".
Проблема в том, что вы пишете код и ожидаете, что Entity Framework переведет его в SQL ... он не может этого сделать. Точно так же, как LINQ to SQL не может этого сделать.
Представьте, если ваша собственность прочитает файл с диска "C: \" ... как вы думаете, как он с этим справится? - невозможно.
Надеюсь, это прозвучало не слишком резко ... я должен сказать, что как только ваш запрос является "локальным", вы можете добавить предложение where (но это LINQ to Objects - и это локально, а не на уровне БД ).
Это то, что вы пытаетесь сделать - создать метод, который применяет фильтр к запросам клиентов.
Я не знаю 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
Надеюсь, это сработает!
Вы можете найти запись в блоге с довольно подробным объяснением проблемы здесь: blog.genom-e.com/…
Вы можете обойти эту конкретную проблему, загрузив свой объект Client из представления. Используйте оператор SQL CASE, чтобы установить значение битового столбца:
ВЫБЕРИТЕ col1, col2, col3, LastName ДЕЛО Фамилия КОГДА "Вашингтон" ТО 1 ELSE 0 AS Is Вашингтон ОТ Клиента
Если вы используете представление в качестве основы для объекта сущности Client, столбец IsWashington должен стать членом класса вместе со всеми другими столбцами.
shahkalpesh верен, вам нужно добавить пространство имен вокруг вашего расширенного класса, чтобы оно соответствовало сгенерированному.
Что не так с моим ответом? Как вы решили проблему? Спасибо.