NHibernate QuerySyntaxException

1

I'm trying to return the amount of objects a query will return.

If I run the following command:

query.ToList().Count

The value is returned successfully, however if you 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 constructed 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 you fix this error?

    
asked by anonymous 26.09.2018 / 16:40

1 answer

1

When calling with ToList and then Count:

  

query.ToList (). Count

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

When placing 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 within the select when using count, such as calls with .ToList () and ternary IFs.

    
26.09.2018 / 19:22