none
Erro ao reodernar WebGrid populada por um LINQ com Left Join RRS feed

  • Pergunta

  • Quando tento reodernar uma coluna da minha WebGrid, da o seguinte erro:

    Unable to cast the type 'Anonymous type' to type 'Anonymous type'. LINQ to Entities only supports casting Entity Data Model primitive types.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.NotSupportedException: Unable to cast the type 'Anonymous type' to type 'Anonymous type'. LINQ to Entities only supports casting Entity Data Model primitive types.

    Alguém ja passou por isso e sabe o pq isso acontece?

    Só acontece isso quando o LINQ tem Left Join.

    Desde ja agradeço.


    Paulo Marcelo Dalbosco


    quarta-feira, 27 de março de 2013 12:11

Todas as Respostas

  • Sim passei por isso , se você posta-se o código seria melhor, mas se foi a mesma coisa comigo , o fato é que você deve primeiro ter um IEnumerable ou List de algo e esse algo irá fazer o join

    ex :

    var ListaCategoria = Query.Categoria.ToList(); // primeiro tendo a lista;

    var ListaProduto = Query.Produto.ToList();

    var Ligacao = ListaProduto.Join(ListaCategoria,P => P.IdCategoria , C => C.IdCategoria,(P,C) => new { P , C}).ToList();

    Sei que o seu caso é left , mas acima só ilustrei que primeiro se faz uma lista e desta lista se faz o Join ou  Left Join ( no caso o Select Many)

    Só para esclarecer o Query seria o ORM ( EF ou NHB) provavelmente você está fazendo assim Query.Produtos.Join(......) é isso que não pode pois Query não é primitivo (int,double,string,bool,... ) e nem IEnumerable(List,Arraylist,...)

    Espero ter ajudado.


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br


    • Editado Davi Murilo terça-feira, 2 de abril de 2013 17:18
    terça-feira, 2 de abril de 2013 17:17
  • Estou passando pelo mesmo problema. Tenho o seguinte código:

    var model = (from c in db.Cliente
    join a in db.Acionamento on c.IdCliente equals a.IdCliente into _a
    from sub in _a.DefaultIfEmpty()
    select new
    {   c.IdCliente, c.RazaoSocial, c.CnpjCpf, c.IeRg, c.Quadro,
                  Acio = (sub == null ? String.Empty : sub.IdTipoAcionamento.ToString()) 
             }).ToList(); 
    returnView(model)
    No caso acima tenho informações de 2 tabelas e quero passar para minha View() um único objeto.
    Um cliente tem vários acionamentos mas um acionamento é de um cliente (Relacionamento 1:N) 

    Resumindo, quero exibir dados de 2 tabela numa view dentro de um WebGrid e não está dando certo.

    Abraços!


    Aislan Miranda

    sexta-feira, 8 de novembro de 2013 16:52
  • Ao invés de fazerem "join" como no SQL usem "Include" nas suas entidades.

    O Linq vai se encarregar de trazer as respectivas listas na hierarquia correta.

    Ex usando o código do Aislan:

    private var model = (from c in db.Cliente.Include("Acionamento") select c).ToList();

    E você não pode passar um objeto anônimo para uma view usando "select new{...}".

    Um Model passado via ActionResult para view deve sempre ser tipado.



    sexta-feira, 8 de novembro de 2013 21:41
    Moderador
  • Ao invés de fazerem "join" como no SQL usem "Include" nas suas entidades.

    O Linq vai se encarregar de trazer as respectivas listas na hierarquia correta.

    Ex usando o código do Aislan:

    private var model = (from c in db.Cliente.Include("Acionamento") select c).ToList();

    E você não pode passar um objeto anônimo para uma view usando "select new{...}".

    Um Model passado via ActionResult para view deve sempre ser tipado.



    João, obrigado pelo retorno.

    Eu tinha testado assim como você mencionou acima. Ai em seguida deu um erro informando que eu não tinha uma propriedade de navegação na classe Cliente do Acionamento.
    Então criei na classe: public virtual Acionamento Acionamento { get; set; }
    agora ele exibe o erro:  

    An error occurred while executing the command definition.
    eu acho que deve ser porque estou usando code-first(migrations), em outro projeto que tenho utilizando EF(.dmx) funcionou legal da forma que você falou.


    Aislan Miranda

    sexta-feira, 8 de novembro de 2013 22:37
  • Posta aqui suas classes do code-first pra gente dar uma conferida.

    De primeira já lhe digo que o Virtual Acionamento tem que ser um list, cada cliente tem vários acionamentos certo?

    Então ficaria assim:

    public virtual List<Acionamento> Acionamento { get; set; }

    sábado, 9 de novembro de 2013 15:04
    Moderador
  • Posta aqui suas classes do code-first pra gente dar uma conferida.

    De primeira já lhe digo que o Virtual Acionamento tem que ser um list, cada cliente tem vários acionamentos certo?

    Então ficaria assim:

    public virtual List<Acionamento> Acionamento { get; set; }

    João, Já suspeito o que possa ser, cada cliente tem vários acionamentos, e eu já tenho o virtual List<> como você mencionou acima na minha classe Cliente, é por esse motivo que apresenta o erro, tenho que montar uma forma de agrupar o valor que vem de Acionamento, já que um cliente tem vários.

    Vou ver isso e posto a solução!

    OBS: Se fosse o caso de um cliente ter um único acionamento, já estaria resolvido. Na view ficaria @item.Acionamento.Campo.

    Aislan Miranda

    sábado, 9 de novembro de 2013 16:59