none
Select no EF com IN em uma string RRS feed

  • Pergunta

  • Boa tarde.

    Em meu sistema um registro no banco quase sempre terá umc ampo CODIGO REGISTRO.   E tenho na Session uma lista dos registros que o usuário tem permissão.

    Por exemplo usuário Romulo é do REGISTRO 1, e na session terei Registros = "1,2,3,4".    Tenho até 12 mais ou menos, mas este usuário participa dos 4 registros (empresas).

    Daí tenho que em quase toda query minha por um WHERE também no campo Registro para ver se ele está nesta lista de registros.  Nâo pode correr o risco de ver dados de outra empresa.

    Daí tentei isso:

    public IEnumerable<HistoricoIDConexao> RetornarHistoricoIDConexaoPorIDConexao(int pIDConexao)
            {
                var data = (from r in _Contexto.DbHistoricoIDConexao
                            where (r.CodigoIDConexao == pIDConexao && r.CodigoRegistro.ToString().Contains(GestorWebUtils.Registros))
                            orderby r.DataHora
                            select r).ToList();
    
                return data;
    
            }

    Tentei fazer da forma r.CodigoRegistro.Contais só que tive que fazer um ToString e o EF está enguiçando.  Erro:

    LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.

    Outra dúvida:

    Após uma QUERY EF pronta, eu posso incluir mais um WHERE com estes Registros?  No PHP, uzando Zend_DB, eu criei um método AdicionarWherePadraoEmpresas que daí ele fazia esse Contais em todas as querys.  Eu não precisava montar manualmente sempre.

    Basicamente eu monto a query e chamo um método passando a query.  Exemplo:

    MontarWherePadrao(data);   E dentro ele tem que incluir outro where.


    sábado, 24 de novembro de 2012 17:44

Todas as Respostas

  • Tenta isso:

    var data = (from r in _Contexto.DbHistoricoIDConexao
                where (r.CodigoIDConexao == pIDConexao && GestorWebUtils.Registros.Contains(SqlFunctions.StringConvert((double)r.CodigoRegistro))
                orderby r.DataHora
                select r).ToList();
    
    return data;
    e sim, você pode incluir mais de um Where:
    var result = db.User
    .Where(u => u.OfficeId == 1)
    .Where(u => u.GroupId == 1)
    .ToList();

    http://www.linkedin.com/pub/murilo-kunze/44/191/455



    • Editado Murilo Kunze sábado, 24 de novembro de 2012 18:03
    sábado, 24 de novembro de 2012 18:01
  • A expressão funcionou mas não retornou nenhum registros.

    Fiz as verificações e o GestorWebUtils.Registros está com 1,2,3,4 mesmo.

    O r.CodigoRegistro é 1.  Verifiquei os registros na tabela e estão certinhos mesmo.

    Alguma dica?


    sábado, 24 de novembro de 2012 20:51
  • Para algo mais genérico você pode criar um método que usa IQueryable<T>


    domingo, 25 de novembro de 2012 05:20
  • Como está o seu r.CodigoRegistro?

    Tenta debugar e ver que valor está sendo convertido para string na hora


    Twitter: @MayogaX
    Blog: Dev Blog

    segunda-feira, 26 de novembro de 2012 10:45
  • 1. O CodigoIDConexao também é igual ao pIDConexao?

    2. No GestorWebUtils.Registros os itens não estão com algum tipo de espaçamento? Por exemplo, a string 1 não é correspondente a string "1 ".

    segunda-feira, 26 de novembro de 2012 11:39