Nhibernate Querysyntaxexception

Asked

Viewed 137 times

1

I am trying to return the amount of objects that a query will return.

If I execute the following command:

query.ToList().Count

The value is returned successfully, but I execute the following command:

query.Count()

The following error is returned:

    'query.Count()' threw an exception of type 'NHibernate.Hql.Ast.ANTLR.QuerySyntaxException'
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146232832
    HelpLink: null
    InnerException: null
    Message: "A recognition error occurred. [.Count[Admin.CD_MercadoLivre+ProdutosMercadoLivre](.Select[DSi.Dominio.Entidades.TAB_Produto,Admin.CD_MercadoLivre+ProdutosMercadoLivre](.Where[DSi.Dominio.Entidades.TAB_Produto](NHibernate.Linq.NhQueryable`1[DSi.Dominio.Entidades.TAB_Produto], Quote((prod, ) => (AndAlso(Equal(prod.IntegraMercadoLivre, p1), Equal(prod.Ativo, p2)))), ), Quote((prod, ) => (new ProdutosMercadoLivre()prod.Idprod.DescricaoString.op_Equality(prod.MercadoLivreIdProduto, NULL) ?  : prod.MercadoLivreIdProdutoprod.TipoIntegracaoMercadoLivreProdutoEnviadoprod.QuantidadeEstoqueDisponivelprod.PrecoEqual(prod.PossuiKit, False) ? prod.PrecoPromocao : 00prod.PossuiKit.ToList[DSi.Dominio.Entidades.TAB_ProdutoKit](prod.ProdutoKit, )prod.MercadoLivreTipoAnuncio.Descricaoprod.DataUltimaAlteracaoprod.DataUltimaIntegracaoMercadoLivreprod.Ativoprod.IntegraMercadoLivre)), ), )]"
    QueryString: ".Count[Admin.CD_MercadoLivre+ProdutosMercadoLivre](.Select[DSi.Dominio.Entidades.TAB_Produto,Admin.CD_MercadoLivre+ProdutosMercadoLivre](.Where[DSi.Dominio.Entidades.TAB_Produto](NHibernate.Linq.NhQueryable`1[DSi.Dominio.Entidades.TAB_Produto], Quote((prod, ) => (AndAlso(Equal(prod.IntegraMercadoLivre, p1), Equal(prod.Ativo, p2)))), ), Quote((prod, ) => (new ProdutosMercadoLivre()prod.Idprod.DescricaoString.op_Equality(prod.MercadoLivreIdProduto, NULL) ?  : prod.MercadoLivreIdProdutoprod.TipoIntegracaoMercadoLivreProdutoEnviadoprod.QuantidadeEstoqueDisponivelprod.PrecoEqual(prod.PossuiKit, False) ? prod.PrecoPromocao : 00prod.PossuiKit.ToList[DSi.Dominio.Entidades.TAB_ProdutoKit](prod.ProdutoKit, )prod.MercadoLivreTipoAnuncio.Descricaoprod.DataUltimaAlteracaoprod.DataUltimaIntegracaoMercadoLivreprod.Ativoprod.IntegraMercadoLivre)), ), )"
    Source: "NHibernate"
    StackTrace: "   em NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException()
        em NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate()
        em NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary`2 replacements, Boolean shallow, String collectionRole)
        em NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
        em NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
        em NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
        em NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
        em NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
        em NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
        em NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)"
    TargetSite: {Void ThrowQueryException()}

The query is built as follows:

var query = from prod in db.TAB_Produto.Consulta()
    where prod.IntegraMercadoLivre == true
    && prod.Ativo == true
    select new ProdutosMercadoLivre
    {
        Id = prod.Id,
        Descricao = prod.Descricao,
        MercadoLivreID = prod.MercadoLivreIdProduto == null ? string.Empty : prod.MercadoLivreIdProduto,
        Atualizando = prod.TipoIntegracaoMercadoLivreProdutoEnviado,
        Disponivel = prod.QuantidadeEstoqueDisponivel,
        Preco = prod.Preco,
        PrecoPromocao = prod.PossuiKit == false ? prod.PrecoPromocao : 0,
        PrecoMercadoLivre = 0,
        PossuiKit = prod.PossuiKit,
        ProdutoKit = prod.ProdutoKit.ToList(),
        TipoAnuncio = prod.MercadoLivreTipoAnuncio.Descricao,
        DataUltimaAlteracao = prod.DataUltimaAlteracao,
        DataUltimaIntegracaoMercadoLivre = prod.DataUltimaIntegracaoMercadoLivre,

        Ativo = prod.Ativo,
        IntegraMercadoLivre = prod.IntegraMercadoLivre
    };

How could I fix this mistake?

1 answer

1


When making the call with Tolist and then Count:

query.Tolist(). Count

Your software is requesting the database to bring all records, with all the information that is contained in your select, to from this, the software perform the count of records.

When making the call directly with Count:

query. Count()

Your software is asking the bank to count records, with the direct information you need.

To resolve the error, you need to leave your query as follows:

var query = from prod in db.TAB_Produto.Consulta()
    where prod.IntegraMercadoLivre == true && prod.Ativo == true
    select prod;
var count = query.Count();

Nhibernate is not recognizing the functions that exist within select when using Count, such as calls with . Tolist() and the ternary Ifs.

  • 1

    The problem was precisely the Tolist() within the select, returned the "pure" object and converted later, with that the problem was solved

  • Excellent... One thing unrelated to this that I recommend to do is generate the Sqls of your queries, so that from this it is easy to identify common problems of N+1, functions that are not being called from DBMS, etc...

  • Sql was returning the data right, it was only giving this error when generating by Linq, Thanks for the help

Browser other questions tagged

You are not signed in. Login or sign up in order to post.