Estamos tentando implementar o operador "LIKE" no Entity Framework para nossas entidades com campos de string, mas não parece ser compatível. Alguém mais tentou fazer algo assim?
Esta postagem do blog resume o problema que estamos enfrentando. Poderíamos usar contém, mas isso apenas corresponde ao caso mais trivial de LIKE. A combinação de contains, startswith, endswith e indexof nos leva lá, mas requer uma tradução entre curingas padrão e Linq para código de entidades.
Respostas:
Esta é uma postagem antiga agora, mas para quem está procurando a resposta, este link deve ajudar. Vá para esta resposta se você já estiver usando EF 6.2.x. Para esta resposta se você estiver usando EF Core 2.x
Versão curta:
Método SqlFunctions.PatIndex - retorna a posição inicial da primeira ocorrência de um padrão em uma expressão especificada, ou zeros se o padrão não for encontrado, em todos os tipos de dados de texto e caracteres válidos
Namespace: System.Data.Objects.SqlClient Assembly: System.Data.Entity (em System.Data.Entity.dll)
Uma pequena explicação também aparece neste tópico do fórum .
fonte
Não sei nada sobre EF, na verdade, mas no LINQ to SQL você geralmente expressa uma cláusula LIKE usando String. Contém:
traduz para
(Use
StartsWith
eEndsWith
para outro comportamento.)Não tenho certeza se isso é útil, porque não entendo o que você quer dizer quando diz que está tentando implementar LIKE. Se eu não entendi completamente, me avise e excluirei esta resposta :)
fonte
Eu tive o mesmo problema.
Por enquanto, resolvi usar a filtragem Wildcard / Regex do lado do cliente com base em http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes?msg=1423024#xx1423024xx - é simples e funciona como esperado.
Eu encontrei outra discussão sobre este tópico: http://forums.asp.net/t/1654093.aspx/2/10
Esta postagem parece promissora se você usar o Entity Framework> = 4.0:
Nota: esta solução é apenas para SQL-Server, porque usa a função PATINDEX não padrão.
fonte
Atualização: No EF 6.2 existe um operador semelhante
fonte
Where(obj => DbFunctions.Like(obj.Column , "%expression%")
:?Existe um
LIKE
operador adicionado emEntity Framework Core 2.0
:Comparando com
... where e.Title.Contains("developer") ...
ele é realmente traduzido emSQL
LIKE
vez deCHARINDEX
vermos comoContains
método.fonte
É especificamente mencionado na documentação como parte do Entity SQL. Você está recebendo uma mensagem de erro?
http://msdn.microsoft.com/en-us/library/bb399359.aspx
fonte
se você estiver usando o MS Sql, escrevi 2 métodos de extensão para oferecer suporte ao caractere% para a pesquisa curinga. (LinqKit é necessário)
uso
em ef6 e deve ser traduzido para
', @ p__linq__0 ='% He% llo% ', @ p__linq__1 ='% Hi% ', @ p__linq_2 ='% ativo '
fonte
Para EfCore, aqui está um exemplo para construir a expressão LIKE
fonte
Você pode usar um real como em Link para Entidades com bastante facilidade
Adicionar
ao seu EDMX nesta tag:
Lembre-se também do namespace no
<schema namespace="" />
atributoEm seguida, adicione uma classe de extensão no namespace acima:
Este método de extensão agora será mapeado para a função EDMX.
Mais informações aqui: http://jendaperl.blogspot.be/2011/02/like-in-linq-to-entities.html
fonte