LINQ TO SQL - CONVERSÃO DE OBJETOS
Olá, boa noite!
Tenho tentado algumas coisas novas em meus projetos, uma delas é o tal Linq to SQL. To apanhando bastante ...
Agora estou tentando criar uma classe genérica, assim:
Algo simples.
A ideia é a seguinte:
Pegar os registros de um tipo genérico Tipo (que implementa a interface IFiltroDescricao)...
Usar o Select para converter para o tipo IFiltroDescricao...
Usar a propriedade da interface Descricao para poder filtrar os registros...
Recuperar a lista de objetos do tipo genérico.
Era pra ser simples. Só que está dando esse erro:
Unable to cast the type [ô]MAVIC.Model.Cliente[ô] to type [ô]System.Object[ô]. LINQ to Entities only supports casting EDM primitive or enumeration types.
Nesse caso, o tipo Cliente é o tipo passado como genérico, e implementa a interface IFiltroDescricao. Era pra funcionar, não?
Ideias?
Obrigado!
Tenho tentado algumas coisas novas em meus projetos, uma delas é o tal Linq to SQL. To apanhando bastante ...
Agora estou tentando criar uma classe genérica, assim:
Public Class DescricaoFiltroUnicoDAO(Of Tipo As Class)
Inherits DAO(Of Tipo)
Public Function RetornaListaContemDescricao(descricao As String) As List(Of Tipo)
Dim retorno As List(Of Tipo)
Using dao As New DAO(Of Tipo)
Dim query As DbQuery(Of IFiltroDescricao) = From r In
dao.Registros.Select(Of IFiltroDescricao)(Function(x) x)
Where r.Descricao.Contains(descricao)
Order By r.Descricao
retorno = query.Select(Of Tipo)(Function(x) x).ToList()
End Using
Return retorno
End Function
End Class
Algo simples.
A ideia é a seguinte:
Pegar os registros de um tipo genérico Tipo (que implementa a interface IFiltroDescricao)...
Usar o Select para converter para o tipo IFiltroDescricao...
Usar a propriedade da interface Descricao para poder filtrar os registros...
Recuperar a lista de objetos do tipo genérico.
Era pra ser simples. Só que está dando esse erro:
Unable to cast the type [ô]MAVIC.Model.Cliente[ô] to type [ô]System.Object[ô]. LINQ to Entities only supports casting EDM primitive or enumeration types.
Nesse caso, o tipo Cliente é o tipo passado como genérico, e implementa a interface IFiltroDescricao. Era pra funcionar, não?
Ideias?
Obrigado!
O LINQ to Entities não suporta transformar SQL para uma classe não-entidade, mesmo quando ele herda de uma classe entidade, porque não há nenhum mapeamento para as colunas adicionais para a instrução SELECT. Se você quiser driblar esse erro, vai ter que materializar os dados na memória para depois fazer a conversão. Por isso aconselho a testar sem o [Ô]Using[Ô]. Faz isso e veja se funciona.
Public Class DescricaoFiltroUnicoDAO(Of Tipo As Class)
Inherits DAO(Of Tipo)
Public Function RetornaListaContemDescricao(descricao As String) As List(Of Tipo)
Dim dao As New DAO(Of Tipo)
Dim query As DbQuery(Of IFiltroDescricao) = From r In
dao.Registros.Select(Of IFiltroDescricao)(Function(x) x)
Where r.Descricao.Contains(descricao)
Order By r.Descricao
[ô]Dao.FecharConexao
return query.Select(Of Tipo)(Function(x) x).ToList()
End Function
End Class
Isso é o que gosto de ver! Infelizmente é como o JABA disse, você teria que fazer o cast de object para sua entidade. Minha sugestão:
Ao invés do LINQ, usar reflection para pegar a propriedade que quer filtrar e adicionar na sua classe a constraint da sua interface.
Ao invés do LINQ, usar reflection para pegar a propriedade que quer filtrar e adicionar na sua classe a constraint da sua interface.
JABA
Valeu pela resposta. Infelizmente, com Using ou sem, o resultado é o mesmo.
Eu sei que se eu selecionar tudo, usar o método ToList para armazenar tudo na memória e usar o método Where do Enumerable, vai funcionar. O problema é que isso deve ser uma má prática né, até porque, se tiver muitos itens... bye bye memória?
Deveria existir um jeito de você já conseguir filtrar na própria consulta. Estou apanhando aqui, mas ainda não desisti.
KERPLUNK
Valeu pela resposta.
Essa parte: [Ô]adicionar na sua classe a constraint da sua interface.[Ô] Ficou um pouco nebulosa pra mim. Poderia me explicar melhor?
Valeu pela resposta. Infelizmente, com Using ou sem, o resultado é o mesmo.
Eu sei que se eu selecionar tudo, usar o método ToList para armazenar tudo na memória e usar o método Where do Enumerable, vai funcionar. O problema é que isso deve ser uma má prática né, até porque, se tiver muitos itens... bye bye memória?
Deveria existir um jeito de você já conseguir filtrar na própria consulta. Estou apanhando aqui, mas ainda não desisti.
KERPLUNK
Valeu pela resposta.
Essa parte: [Ô]adicionar na sua classe a constraint da sua interface.[Ô] Ficou um pouco nebulosa pra mim. Poderia me explicar melhor?
Deixando tudo na memória, funciona tranquilo.
Segue a implementação:
Mas ainda to com aquele sentimento de que não estou fazendo da melhor forma.
Sugestões?
Segue a implementação:
Public Function RetornaListaContemDescricao(descricao As String) As List(Of Tipo)
Dim retorno As List(Of Tipo)
Using dao As New DAO(Of Tipo)
Dim query As DbQuery(Of Tipo) = From r In dao.Registros
retorno = query.ToList().Select(Of IFiltroDescricao)(Function(x) x).
Where(Function(x) x.Descricao.Contains(descricao)).OrderBy(Function(x) x.Descricao).
Select(Of Tipo)(Function(x) x).ToList()
End Using
Return retorno
End Function
Mas ainda to com aquele sentimento de que não estou fazendo da melhor forma.
Sugestões?
Tópico encerrado , respostas não são mais permitidas