Как расширить объекты ADO.NET Entity Framework частичными классами? - PullRequest
5 голосов
/ 04 ноября 2008

Я создал проект приложения Visual Basic WPF, который содержит 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 не распознает метод метода Boolean IsWashington (), и этот метод нельзя преобразовать в выражение хранилища.

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

Ответы [ 5 ]

3 голосов
/ 04 ноября 2008

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

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

Надеюсь, это работает!

2 голосов
/ 04 ноября 2008

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

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

1 голос
/ 20 декабря 2008

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

1 голос
/ 05 ноября 2008

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

ВЫБРАТЬ col1, col2, col3, LastName CASE LastName КОГДА «Вашингтон» ТОГДА 1 Иначе 0 как вашингтон ОТ клиента

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

1 голос
/ 04 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...