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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top