2010-03-16 2 views
30

Il file della guida fornito con Dynamic Linq in CSharpSamples.zip non mostra alcun esempio di utilizzo di contiene o simili.Come utilizzare "contiene" o "mi piace" in una query dinamica di linq?

Esistono soluzioni semplici per fare ciò? e dove (col like @col) non funziona.

+0

Si prega di notare tutti quelli di cui sto discutendo il LINQ DYNAMIC fornito con Visual Studio nel file di esempio. In questa versione, posso definire una query where usando una stringa "mycol = @mycol". Conosco i casi semplici. –

+0

Quello che vorrei * veramente * fare è inserire la stringa "Mi piace" al posto di "=" nella mia stringa e fare in modo che Dynamic Linq la analizzi. Ma, mi prenderò un lavoro in giro. Penso che il motivo per cui non è stato aggiunto è che hanno generato il loro parser su System.Linq.Expressions che non ha questo metodo. –

+0

Per essere chiari, io posso fare questo "username = @ 0, Contact.FirstName = @ 1" Ma non questa "nomeutente come @ 0, Contatto.FirstName come @ 1" Dove queste sono le stringhe, e utilizzando la sintassi LINQ dinamica: dc.table.where (Stringa, array) –

risposta

56

Ecco la risposta! Il Dynamic Linq supporta il. operatore,

Secondo la documentazione:

"campo Istanza o istanza di proprietà accesso qualsiasi campo pubblico o di proprietà è possibile accedere."

Così, è possibile utilizzare questa sintassi

.Where("MyColumn.Contains(@0)", myArray) 

Grazie per tutti i suggerimenti! E grazie a me per aver trovato la soluzione.

+1

Come posso fare che in una colonna Null – Thea

+8

@Teddy .Dove (? "MyColumn ! = null && MyColumn.Contains (@ 0) ", myArray) –

+0

Come convertire una griglia' FilterExpression' in questa sintassi? Ci sono alcune librerie NuGet Dynamic LINQ, incluso il supporto per .NET 4.0 ... sappiamo se hai aggiunto il supporto per la conversione da LIKE a Contains (o altro)? – PeterX

1

Si noti che la soluzione fornita funziona solo per casi semplici: se si desidera utilizzare i parametri per l'origine della chiamata Contiene e/o se si desidera utilizzare la raccolta interrogata corrente da utilizzare come parametro per Contiene chiama, quindi la soluzione fornita non funzionerà.

Si possono trovare nel seguente post del blog una soluzione per estendere correttamente la libreria dinamica Linq e aggiungere il supporto per l'estensione Contiene:

http://blog.walteralmeida.com/2010/05/advanced-linq-dynamic-linq-library-add-support-for-contains-extension-.html

4

Per me la soluzione è stata outerIt.

class User { public string Name { get; set; } } 
    ... 
    IQueryable<User> query = db.Users; 
    ... 
    query = query.Where("@0.Contains(outerIt.Name)", list); 

Nota che outerIt è una specie di parola chiave costruita nella biblioteca (non è necessario modificare come si può leggere in una risposta qui). È possibile accedere alla proprietà del tipo di query attraverso di essa.