2013-04-26 18 views
9

Próbuję utworzyć odpowiednią kwerendę linq, aby spełnić moją funkcję wyszukiwania.C# kwerenda wyszukiwania z linq

Mam tabelę z następującymi kolumnami: 'firstname' | "nazwisko" | 'opis'. z następującymi danymi: "Peter" | "Mulder" | "To jest mały opis".

Moje słowo kluczowe "szukaj" może wyglądać tak: "peter" lub "mały opis".

Teraz, jeśli mogę użyć następującego wyrażenia linq w lambda:

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

Teraz mogę uzyskać wynik, gdy używam „Peter”, ale jeśli mogę użyć Pete 'lub „trochę opis” otrzymuję brak wyników. W jaki sposób mogę wprowadzić moje wyrażenie linq, aby mógł przeszukiwać dane kolumn dla dopasowań?

+0

można rzucić okiem tutaj: [kolekcja filtrowanie LINQ] (http://stackoverflow.com/questions/1324774/filtering-collection-with-linq) – Tigran

+6

'search.Contains (t.Firstname) 'lub' t.Firstname.Contains (szukaj) '? – I4V

+0

To, co robisz, to "" "Pete" lub "mały opis". Zawiera ("peter") 'dla twojego pierwszego testu w Linq, i że zawsze zwróci false. – CodeNaked

Odpowiedz

25

Chyba po prostu trzeba go do tyłu.

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

To nie zadziała. Jego ciąg wyszukiwania == '' 'pete' lub 'mały opis' ". – CodeNaked

+7

@CodeNaked: Mówi kto? Powiedział, że jego ciąg wyszukiwania może być "pete", lub może to być "mały opis". – StriplingWarrior

+0

Zastanawiasz się, czy brakuje przed chwilą nawiasu. Wybierz? –

3

Jednym z możliwych (ale prawdopodobnie nie najbardziej zoptymalizowane rozwiązanie) byłoby dołączenie wszystkich dziedzinach razem i zrobić Contains na szukanej frazy, np

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

możesz dodać separator jakiegoś rodzaju, w przeciwnym razie wyszukiwanie takie jak "setpete" będzie pasować niepoprawnie. –

+0

@ ErenErsönmez Wielki telefon. –

+0

O mój Boże. Jesteście tak dobrzy. Odwróciłem się i patrzyłem w niewłaściwych miejscach. – codingjoe

0

Wypróbuj ten kod.

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); 
} 
}