studio - ¿Cómo extiendo los objetos de ADO.NET Entity Framework con clases parciales?
ado.net c# pdf (5)
Creé un proyecto de aplicación WPF de Visual Basic que contiene Toy.edmx, un modelo de datos de entidad ADO.NET generado a partir de una base de datos llamada Toy.
Su archivo Window1.xaml.vb se ve así:
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
Eso funciona bien.
Pero, si agrego 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 agrega una cláusula WHERE a mi consulta Window1.xaml.vb ...
9 Label1.Content = (From c As Client In dc.ClientSet _ 10 Where c.IsWashington _ 11 Select c).First.FirstName
... entonces recibo esta NotSupportedException:
LINQ to Entities 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?
¿Qué tipo es clase de cliente?
Es posible que necesite agregar espacio de nombres (el mismo en que se definen las "Clases de entidades" del Cliente) al archivo que contiene "IsWashington".
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.
Es esto lo que intenta hacer: crear un método que aplique un filtro a las consultas del Cliente.
No sé vb.net, así que no confíes 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 tarde, un código de llamada.
IQueryable(Of Client) someQuery = dc.ClientSet.AsQueryable
someQuery = Client.IsWashington(someQuery)
Label1.Content = someQuery.First.FirstName
¡Espero que esto funcione!
Podría solucionar este problema en particular al alimentar su objeto Cliente desde una Vista. Use la sentencia SQL CASE para establecer un valor de columna de bit:
SELECCIONE col1, col2, col3, Apellido CASO Apellido CUANDO ''Washington'' ENTONCES 1 ELSE 0 COMO IsWashington FROM Cliente
Si usa la vista como base para su objeto de entidad Cliente, la columna IsWashington debe convertirse en miembro de la clase junto con todas las otras columnas.
shahkalpesh es correcto, necesita agregar el espacio de nombres alrededor de su clase extendida para que coincida con el generado.