2013-04-26 17 views
9

Sto tentando di creare una query di linq adatta a soddisfare la mia funzionalità di ricerca.Query di ricerca C# con linq

Ho una tabella con le seguenti colonne: "nome" | 'cognome' | 'descrizione'. con i seguenti dati: "Peter" | 'Mulder' | 'Questa è una piccola descrizione.'

La mia parola chiave 'cerca' potrebbe essere qualcosa come: "peter" o "una piccola descrizione".

Ora, se io uso la seguente espressione LINQ in lambda:

mycontext.persons.Where(t => search.Contains(t.Firstname) || search.Contains(t.Lastname) || search.Contains(t.Description).Select(p => p).ToList(); 

Ora ho il mio risultato, quando uso 'Peter', ma se uso 'pete' o 'un po' descrizione' ottengo nessun risultato. Come posso rendere la mia espressione linq, in modo che possa cercare tra i dati della colonna per le corrispondenze?

+0

si può avere uno sguardo qui: [raccolta di filtraggio con LINQ] (http://stackoverflow.com/questions/1324774/filtering-collection-with-linq) – Tigran

+6

'search.Contains (t.Firstname) 'o' t.Firstname.Contains (search) '? – I4V

+0

Quello che stai facendo è "" 'pete' o 'una piccola descrizione' ". Contiene (" peter ")' per il tuo primo test in Linq, che restituirà sempre false. – CodeNaked

risposta

25

penso che devi solo all'indietro:.

mycontext.persons 
    .Where(t => 
     t.Firstname.Contains(search) || 
     t.Lastname.Contains(search) || 
     t.Description.Contains(search)) 
    .ToList(); 
+0

Non funzionerà. La sua stringa di ricerca == "" 'pete' o 'una piccola descrizione' ". – CodeNaked

+7

@CodeNaked: dice chi? Ha detto che la sua stringa di ricerca potrebbe essere "pete", o potrebbe essere "una piccola descrizione". – StriplingWarrior

+0

Basta chiedersi c'è una parentesi mancante prima. Selezionare? –

3

Una possibile (ma probabilmente non la soluzione più ottimizzata) sarebbe per aggiungere tutti i campi insieme e fare un Contains sul termine di ricerca, ad esempio,

var result = persons.Where(q => (q.Description + " " q.FirstName + " " q.LastName) 
        .ToLower() 
        .Contains(searchTerm.ToLower())) 
        .ToList(); 
+1

potresti voler aggiungere un delimitatore di qualche tipo, altrimenti una ricerca come "tionpete" corrisponderà in modo errato. –

+0

@ ErenErsönmez Grande chiamata. –

+0

Oh mio Dio. Voi ragazzi avete ragione. Avevo fatto all'indietro e continuavo a guardare nei posti sbagliati. – codingjoe

0

provare questo codice.

private void SearchData() 
{ Model1Container model = new Model1Container(); 
try 
{ 
var query = model.Scholars.AsQueryable(); 
if(!string.IsNullOrEmpty(this.txtSearch.Text)) 
{ 
// query = query.Where(x=>x.ScholarName.StartsWith(txtSearch.Text)); 
query = (from Schl in model.Scholars 
where Schl.ScholarName.StartsWith(txtSearch.Text) || 
Schl.PhoneRes.StartsWith(txtSearch.Text) || 
Schl.PhoneOff.StartsWith(txtSearch.Text) || 
Schl.Mobile.StartsWith(txtSearch.Text) || 
Schl.Email.StartsWith(txtSearch.Text) 
orderby Schl.ScholarName 
select Schl); 
} 
this.dgvScholarList.DataSource = query.ToList(); 
} 
catch (Exception ex) 
{ 
MessageBox.Show(ex.Message); 
} 
}