LinqToSql e pesquisa de texto completo - isso pode ser feito?
-
09-06-2019 - |
Pergunta
Alguém descobriu uma boa maneira de realizar pesquisas de texto completo (FREETEXT() CONTAINS()
) para qualquer número de palavras-chave arbitrárias usando a sintaxe de consulta LinqToSql padrão?
Obviamente, eu gostaria de evitar ter que usar um Stored Proc ou gerar chamadas SQL dinâmicas.
Obviamente, eu poderia simplesmente inserir a string de pesquisa em um parâmetro para um SPROC que usa FREETEXT() ou CONTAINS(), mas esperava ser mais criativo com a pesquisa e criar consultas como:
"pizza de calabresa" e hambúrguer, não "torta de maçã".
Louco, eu sei - mas não seria legal poder fazer isso diretamente do LinqToSql?Qualquer dica sobre como conseguir isso seria muito apreciada.
Atualizar:Eu acho que posso estar no caminho certo aqui...
Também:Reverti a alteração feita no título da minha pergunta porque ela realmente mudou o significado do que eu estava perguntando.EU saber essa pesquisa de texto completo não é suportada no LinqToSql - eu teria feito essa pergunta se quisesse saber disso.Em vez disso - atualizei meu título para apaziguar as massas que gostam de editar.
Solução
Infelizmente, o LINQ to SQL não oferece suporte à pesquisa de texto completo.
Há vários produtos por aí que acho que poderiam:Lucene.NET, NHibernate Search vem à mente.O LINQ for NHibernate combinado com o NHibernate Search provavelmente forneceria essa funcionalidade, mas ambos ainda estão em fase beta.
Outras dicas
Consegui contornar isso usando uma função com valor de tabela para encapsular o componente de pesquisa de texto completo e, em seguida, referenciei-o em minha expressão LINQ, mantendo os benefícios da execução atrasada:
string q = query.Query;
IQueryable<Story> stories = ActiveStories
.Join(tvf_SearchStories(q), o => o.StoryId, i => i.StoryId, (o,i) => o)
.Where (s => (query.CategoryIds.Contains(s.CategoryId)) &&
/* time frame filter */
(s.PostedOn >= (query.Start ?? SqlDateTime.MinValue.Value)) &&
(s.PostedOn <= (query.End ?? SqlDateTime.MaxValue.Value)));
Aqui, 'tvf_SearchStories' é a função com valor de tabela que usa internamente a pesquisa de texto completo