LINQ TO SQL - CONVERSÃO DE OBJETOS

DS2T 03/06/2016 02:23:31
#462964
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:

    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!
JABA 03/06/2016 02:52:25
#462965
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

KERPLUNK 03/06/2016 18:07:46
#463018
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.
DS2T 03/06/2016 23:49:24
#463042
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?
DS2T 04/06/2016 01:04:23
#463047
Deixando tudo na memória, funciona tranquilo.
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