Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

@fabiosantosrj

ignorar acento em consulta linq c#

Recommended Posts

pessoal,

 

atualmente utilizo a query abaixo para buscar registros no banco :

 

Propriedades.PortalDataContext dc = DataContextFactory.CriaPortalDataContext();
       	var query = from Propriedades.Portal.vw_web_produto sql_produto in dc.vw_web_produtos
                   	where sql_produto.Produto.IndexOf(produto) > -1
                   	select sql_produto;

       	return query.ToList<API.Propriedades.Portal.vw_web_produto>();

 

beleza. Com o IndexOf eu simulo o like '%%' do sql. Porém, se busco pela palavra 'Além da vida' ele encontra o registro. Mas, se procuro por 'Alem da vida' ele não encontra por que o registro tem acento e eu não coloquei na busca. Como fazer para na consulta eu ignorar os acentos e receber o resultado com ou sem acento mantendo o like '%%'

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Ivan,

 

Agradeço pela ajuda. Mas, no meu caso eu preciso usar esse conceito no Linq, e não da para usar essa função pq ele diz que o sqlserver nao existe a funcao.

 

eu preciso de algo para o linq.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que você esta falando, você quer ignorar os acentos do conteúdo que vem do banco, é isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

quase isso.

O que eu quero é que a partir de uma string ele localize no banco mesmo que a string tenha ou não acento.

 

por exemplo: na string "Além da vida", eu quero que ele busque no banco no campo sql_produto.produto (query acima) todos os registros que contenham "Além da vida" ou "Alem da vida" ou "Alêm da vída" e assim por diante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, pra isso você vai ter que mudar o colate de DB.

 

da uma olhada em http://stackoverflow.com/questions/322441/ignoring-accents-in-sql-server-using-linq-to-sql

Compartilhar este post


Link para o post
Compartilhar em outros sites

agradeço a ajuda até aqui.

esse método eu já conheço. Mas, nao me serve. Porque eu posso sim querer buscar com os acentos em outras ocasiões.

preciso de algo que seja no Linq.

 

Já pensei numa gambiarra, criar outro campo no banco e manter o mesmo conteudo do campo que eu quero (mantenho através de trigger). e esse novo campo usar a ideia do colate. Dessa forma eu sei que vai funcionar, mas acho que o Linq deve ter algo inteligente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

estava com o mesmo problema e não encontrei uma solução na net, mas acabei resolvendo conforme exemplo abaixo.

 

using System.Collections.Generic;
using System.Linq;
using System.Data.Objects;
using System.Data;
using System;
using System.Collections;
List<TUSUARIO> lstUsuarios = entity.TUSUARIO.ToList();
lstUsuarios = lstUsuarios.ToList().Where(u => u.ANOM_USUARIO.Normalize(System.Text.NormalizationForm.FormD).ToLower().Contains(usuario.NomeSemAcento.ToLower())).ToList();

 

A propriedade "NomeSemAcento", retorna o nome que foi passado para o método abaixo, este eu encontrei em vários sites espalhados pela www.

 

using System;
using System.Text;
using System.Globalization;
public static string RemoverAcentos(string texto)
	{
		String textoNormalizado = texto.Normalize(NormalizationForm.FormD);
		StringBuilder textoSemAcento = new StringBuilder();
		for (int i = 0; i < textoNormalizado.Length; i++)
		{
			Char c = textoNormalizado[i];
			if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
				textoSemAcento.Append(c);
		}
		return textoSemAcento.ToString();
	}

 

Antes eu trabalhava com IQueryable, mas percebi que nele não era possível fazer as normalizações necessárias.

 

Usando o List é necessário fazer conversões (ToList()), mas também é possível fazer o uso de normalizações, as quais resolvem o problema de consulta independente de acentos e com o ToLower passa a buscar indiferente de maiúsculas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.