Usuário com melhor resposta
Comparar intervalo de campo texto com Linq

Pergunta
-
Bom dia,
Como realizar uma pesquisa com campos do tipo texto?
Na tabela que eu estou utilizando o campo COFCFO, que é o código do cliente/fornecedor, é do tipo texto e quero selecionar um intervalo, exemplo 000001 até 000030, abaixo segue o código que eu fiz.
var listRet = from a in ctx.FLAN where a.CODCOLIGADA == iColigada && a.STATUSLAN == 0 && a.DATAVENCIMENTO >= dtIni && a.DATAVENCIMENTO <= dtFim && a.CODCFO >= cCodCFOIni && a.CODCFO <= cCodCFOFim && a.PAGREC == iTipoCF && (a.CODTDO == "ADC" || a.CODTDO == "ADF" || a.CODTDO == "NC-A") select new Adiantamento { CodCFO = a.CODCFO, NomeCliente = (from x in ctx.FCFO where a.CODCFO == x.CODCFO select x.NOME).FirstOrDefault(), Historico = a.HISTORICO, DataVencimento = a.DATAVENCIMENTO, VlrBaixado = a.VALORBAIXADO, CodTDO = a.CODTDO, VlrTitulo = a.VALORORIGINAL };
Acontece que está dando erro nas condições "a.CODCFO >= cCodCFOIni" e "a.CODCFO <= cCodCFOFim", pois não é possível utilizar o operador ">= ou <=" com campos do tipo texto.
Como eu posso fazer esse tipo de pesquisa?
Att,
Leandro.
- Editado Marcos SJ sexta-feira, 15 de abril de 2016 13:16 Edição
Respostas
-
Opa, tudo bom LeandroMarcelino?
A menos que espere que haja valores de texto alfanumérico neste campo, o que simplemente impediria uma comparação usando operadores aritméticos, porque você está utilizando um campo que armazena um valor numérico como texto?! :)
De qualquer forma, além da recomendação de alterar o valor do campo para INT (de -2,147,483,648 até 2,147,483,647) ou mesmo BIGINT (-9,223,372,036,854,775,808 até 9,223,372,036,854,775,807!!!) caso a expectativa é que sejam números muito grandes MESMO, não há muito que se possa fazer além de uma gambiarra forte mesmo, como iterar por todos os registros fazendo um convert ou cast dos campos de texto para tipos inteiros e comparar o valor para ver se está dentro do range que você precisa.
Alternativamente, você pode tentar converter o tipo do campo na clausula where, mas eu não acredito que isso vá funcionar, eu não cheguei a testar o código:
var listRet = from a in ctx.FLAN where a.CODCOLIGADA == iColigada && a.STATUSLAN == 0 && a.DATAVENCIMENTO >= dtIni && a.DATAVENCIMENTO <= dtFim && Convert.ToInt32(a.CODCFO) >= cCodCFOIni && Convert.ToInt32(a.CODCFO) <= cCodCFOFim && a.PAGREC == iTipoCF && (a.CODTDO == "ADC" || a.CODTDO == "ADF" || a.CODTDO == "NC-A") select new Adiantamento { CodCFO = a.CODCFO, NomeCliente = (from x in ctx.FCFO where a.CODCFO == x.CODCFO select x.NOME).FirstOrDefault(), Historico = a.HISTORICO, DataVencimento = a.DATAVENCIMENTO, VlrBaixado = a.VALORBAIXADO, CodTDO = a.CODTDO, VlrTitulo = a.VALORORIGINAL };
Enfim, mude os campos para tipos numéricos :)
Aquele abraço!
- Marcado como Resposta Marcos SJ sexta-feira, 15 de abril de 2016 13:43
Todas as Respostas
-
Opa, tudo bom LeandroMarcelino?
A menos que espere que haja valores de texto alfanumérico neste campo, o que simplemente impediria uma comparação usando operadores aritméticos, porque você está utilizando um campo que armazena um valor numérico como texto?! :)
De qualquer forma, além da recomendação de alterar o valor do campo para INT (de -2,147,483,648 até 2,147,483,647) ou mesmo BIGINT (-9,223,372,036,854,775,808 até 9,223,372,036,854,775,807!!!) caso a expectativa é que sejam números muito grandes MESMO, não há muito que se possa fazer além de uma gambiarra forte mesmo, como iterar por todos os registros fazendo um convert ou cast dos campos de texto para tipos inteiros e comparar o valor para ver se está dentro do range que você precisa.
Alternativamente, você pode tentar converter o tipo do campo na clausula where, mas eu não acredito que isso vá funcionar, eu não cheguei a testar o código:
var listRet = from a in ctx.FLAN where a.CODCOLIGADA == iColigada && a.STATUSLAN == 0 && a.DATAVENCIMENTO >= dtIni && a.DATAVENCIMENTO <= dtFim && Convert.ToInt32(a.CODCFO) >= cCodCFOIni && Convert.ToInt32(a.CODCFO) <= cCodCFOFim && a.PAGREC == iTipoCF && (a.CODTDO == "ADC" || a.CODTDO == "ADF" || a.CODTDO == "NC-A") select new Adiantamento { CodCFO = a.CODCFO, NomeCliente = (from x in ctx.FCFO where a.CODCFO == x.CODCFO select x.NOME).FirstOrDefault(), Historico = a.HISTORICO, DataVencimento = a.DATAVENCIMENTO, VlrBaixado = a.VALORBAIXADO, CodTDO = a.CODTDO, VlrTitulo = a.VALORORIGINAL };
Enfim, mude os campos para tipos numéricos :)
Aquele abraço!
- Marcado como Resposta Marcos SJ sexta-feira, 15 de abril de 2016 13:43
-
Boa tarde,
Eu não posso mudar o campo da tabela para numérico, esse banco é do nosso ERP (Totvs), eu estou gerando os relatórios, pelo VS - C# que é mais completo que a ferramenta de relatório da Totvs.
Vou tentar converter os campos no where e vamos ver se da certo.
Obrigado.
-
-