Quindi, ho questa espressione lambda e funziona bene
list = list.Where(x => x.ListaDocumentoCaixa.Any(d => d.Observacao.Contains(term.Trim())));
Devo aggiungere che questa colonna è un campo varchar(6000)
. Finora, questo ha funzionato bene come ho detto, ma di recente ho avuto un problema. Sembra che se il termine della ricerca si verifica dalla posizione 4001 della stringa e su, la query non riesce a restituirmi nulla.
Dopo alcuni tentativi ho trovato questo commentato sulla query prodotta da Entity Framework
-- p__linq__0: 'maria stela gonsa' (Type = String, Size = 4000)
Poi, dopo alcune ricerche, ho scoperto che questo è il comportamento comune di Entity, tuttavia, non posso avere questo tipo di limitazione sull'applicazione. La mia domanda è: c'è un modo per cambiare questo comportamento? Mi piacerebbe molto evitare di dover scrivere questa query come testo semplice ed eseguirlo con ExecuteQuery
se possibile.
Grazie in anticipo per l'aiuto!
Ti suggerisco di seguire il seguente articolo, supponendo che tu stia utilizzando SQL server, su come creare un indice di ricerca di testo completo e utilizzarlo in Entity Framework con C #.
Esecuzione di istruzioni LIKE (che sono le mappe di Contains () su) è ALTAMENTE inefficiente su grandi campi varchar.
EDIT: il riassunto del collegamento è:
1.) Creare un indice di testo completo sul campo utilizzando la procedura guidata del server SQL. Questo campo di testo completo consentirà le ricerche CONTAINS e FREETEXT sull'intero campo e sarà molto più efficiente.
2.) Scrivi una stored procedure che unisce la tabella in questione ai risultati dell'indice di testo libero.
3.) Creare una classe Entity Framework per rappresentare i risultati da quella stored procedure e utilizzare EF per chiamare e restituire un elenco di tali risultati.