2013-01-19 13 views
7

Ho una colonna nella mia tabella contenente valoriRegex a Linq (EntityFramework), elaborazione stringa nel database

"FilterA:123,234,34;FilterB:12,23;FilterC:;FilterD:45;" 

filtri sono separati da ';' e i valori di ciascun filtro sono separati da ",". C'è un ':' tra il nome di un filtro e i suoi valori.

Ora, posso fare qualsiasi cosa che possa recuperare solo la parte dei valori? Come "123,234,34" per "Filtro A". Oppure posso dargli un numero come "234" per cercare nella parte del valore di "FilterA" e/o "54" nella parte value di "FilterB"? So che è possibile usare regex, credo, ma non ho idea di come.

+0

Vuoi trovare alcune righe in base al valore di un filtro o vuoi estrarre i valori del filtro da alcune righe già selezionate? – SDReyes

+0

Voglio selezionare alcune righe confrontando i miei dati con i dati nella stringa di filtro –

risposta

11

Non è possibile utilizzare le espressioni regolari in Linq alle query di entità, poiché non possono essere tradotte in SQL. Non è nemmeno possibile utilizzare String.Split per dividere i filtri per ;. Sono disponibili due opzioni:

  • Modifica la struttura della tabella del database. Per esempio. crea la tabella Foo_Filter che collegherà le tue entità ai filtri. Quindi creare la tabella Filters che conterrà i dati dei filtri.
  • Eseguire query in memoria e utilizzare Linq to Objects. Questa opzione sarà lento, perché si deve recuperare tutti i dati dal database alla memoria
+0

"Esegui query in memoria e usa Linq su Oggetti. Questa opzione sarà lenta, perché devi recuperare tutti i dati dal database alla memoria" questo è ciò che ho cercato di evitare! –

+1

@TahaRehmanSiddiqui quindi solo la prima opzione lasciata per te. Non c'è modo di recuperare i dati FilterA dalla stringa con Linq alle entità –

0

+1 per @lazyberezovsky, non si può fare regex in LINQ to Entities perché non può tradurlo in SQL. È possibile richiamare tutti i record nella memoria, quindi fare da Linq agli oggetti su di esso (fare un .ToList() a una variabile quindi una seconda query linq per questa espressione regolare) ma ciò significa che caricherete tutti i record db in memoria per elaborare questa query. Stessi consigli: cambia la struttura del DB in modo tale che non sia necessario.

0

Suppongo che se si desidera eseguire tutto sul server database, è necessaria una funzione SQL che possa analizzare questi filtri, magari restituendo una tabella a più colonne. Purtroppo non sono su una macchina in cui potrei fornire qualsiasi codice di esempio.

2

Se il provider di database sottostante è SQL Server allora si potrebbe fare uso di SqlMethods.Like per filtrare il risultato del database impostare fino a un sottoinsieme gestibile di dati che possono poi essere analizzati a livello locale con RegEx