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

Я создал проект приложения 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 частичными классами?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
6 852
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Какой тип это клиентский класс?

Возможно, вам потребуется добавить пространство имен (такое же, как то, в котором определен Client "Entity classs") в файл, содержащий "IsWashington".

Что не так с моим ответом? Как вы решили проблему? Спасибо.

shahkalpesh 05.11.2008 01:41
Ответ принят как подходящий

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

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

Надеюсь, это прозвучало не слишком резко ... я должен сказать, что как только ваш запрос является "локальным", вы можете добавить предложение where (но это LINQ to Objects - и это локально, а не на уровне БД ).

Timothy Khouri 04.11.2008 04:41

Это то, что вы пытаетесь сделать - создать метод, который применяет фильтр к запросам клиентов.

Я не знаю 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/…

csgero 04.11.2008 10:33

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

ВЫБЕРИТЕ col1, col2, col3, LastName ДЕЛО Фамилия КОГДА "Вашингтон" ТО 1 ELSE 0 AS Is Вашингтон ОТ Клиента

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

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

Другие вопросы по теме