2008-11-03 6 views
5

He creado un proyecto de aplicación de Visual Basic WPF que contiene Toy.edmx, un modelo de datos de entidad ADO.NET generado a partir de una base de datos llamada Toy.¿Cómo extiendo los objetos de ADO.NET Entity Framework con clases parciales?

Su Window1.xaml.vb archivo es como sigue:

 
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 

que funciona muy bien.

Pero, si añado el archivo Client.vb ...

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

... y añadir una cláusula WHERE para mi Window1.xaml.vb consulta ...

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

... cuando me siento este NotSupportedException:

LINQ a Entiti es no reconoce el método 'Boolean IsWashington()', y este método no se puede traducir a una expresión de tienda.

¿Cómo extiendo los objetos de ADO.NET Entity Framework con clases parciales?

Respuesta

2

El problema es que está escribiendo código, y esperando que Entity Framework lo traduzca a SQL ... no puede hacer eso. Al igual que LINQ to SQL no puede hacer eso.

Imagine si su propiedad lee un archivo de la unidad "C: \" ... ¿cómo cree que manejaría eso? - imposible.

+0

Espero que no suene demasiado duro ... lo que debería decir es que una vez que su consulta es "local", puede agregar su cláusula where (pero eso es LINQ to Objects - y eso es local, no en el DB nivel). –

1

¿Qué tipo es la clase de Cliente?

Es posible que necesite agregar espacio de nombres (el mismo que en el que se define el cliente "Clases de entidad") al archivo que contiene "IsWashington".

+0

¿Qué pasa con mi respuesta? ¿Cómo resolvió el problema? Gracias. – shahkalpesh

3

Esto es lo que intenta hacer: crear un método que aplique un filtro a las consultas del Cliente.

No conozco vb.net, así que no confíe en este código de manos libres al 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 

más adelante, algunos códigos de llamadas.

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

Label1.Content = someQuery.First.FirstName 

Hope esto funciona!

+0

Puede encontrar una entrada de blog con una explicación bastante detallada del problema aquí: http://blog.genom-e.com/PermaLink,guid,4c486a95-12ad-4abf-aba1-7eb893c91ba7.aspx – csgero

1

Puede solucionar este problema en particular al alimentar su objeto Cliente desde una Vista. Utilice la instrucción CASE de SQL para establecer un valor de columna bits:

SELECT col1, col2, col3, Apellido CASO Apellido CUANDO 'Washington' ENTONCES 1 ELSE 0 AS IsWashington desde el cliente

Si se utiliza el Como base para su objeto de entidad cliente, la columna IsWashington debe convertirse en miembro de la clase junto con todas las otras columnas.

1

shahkalpesh es correcto, necesita agregar el espacio de nombres alrededor de su clase extendida para que coincida con el generado.

Cuestiones relacionadas