2013-04-26 60 views
9

Tôi đang cố gắng thực hiện truy vấn LINQ phù hợp để chứa chức năng tìm kiếm của tôi.Truy vấn tìm kiếm C# với linq

Tôi có một bảng với các cột sau: 'firstname' | 'họ' | 'sự miêu tả'. với các dữ liệu sau: 'Peter' | 'Mulder' | 'Đây là một mô tả nhỏ.'

Từ khóa 'tìm kiếm' của tôi có thể giống như: "peter" hoặc "mô tả nhỏ".

Bây giờ nếu tôi sử dụng biểu thức LINQ sau trong lambda:

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

Bây giờ tôi nhận được kết quả của tôi, khi tôi sử dụng 'peter', nhưng nếu tôi sử dụng 'Pete' hoặc 'một mô tả nhỏ' tôi nhận được ko có kết quả. Làm thế nào tôi có thể làm cho biểu thức linq của tôi, do đó, nó có thể tìm kiếm thông qua các dữ liệu cột cho phù hợp?

+0

bạn có thể có một cái nhìn ở đây: [bộ sưu tập Filtering với LINQ] (http://stackoverflow.com/questions/1324774/filtering-collection-with-linq) – Tigran

+6

'search.Contains (t.Firstname) 'hoặc' t.Firstname.Contains (search) '? – I4V

+0

Những gì bạn đang làm là ''' pete 'hoặc' một mô tả nhỏ '. Chứa (" peter ")' cho thử nghiệm đầu tiên của bạn trong LINQ, và điều đó sẽ luôn trả về false. – CodeNaked

Trả lời

25

Tôi nghĩ rằng bạn chỉ có nó ngược:.

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

Điều đó sẽ không hoạt động. Chuỗi tìm kiếm của anh ấy == '" 'pete' hoặc 'một mô tả nhỏ' "'. – CodeNaked

+7

@CodeNaked: Nói ai? Anh ta nói chuỗi tìm kiếm của anh ta có thể là "pete", hoặc nó có thể là "một mô tả nhỏ". – StriplingWarrior

+0

Chỉ cần tự hỏi là có một dấu ngoặc đơn còn thiếu trước đây. Chọn? –

3

Một có thể (nhưng có lẽ không phải là giải pháp tối ưu nhất) sẽ được nối thêm tất cả các lĩnh vực của bạn với nhau và làm một Contains về thời hạn tìm kiếm, ví dụ

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

bạn có thể muốn thêm một dấu phân cách của một số loại, nếu không một tìm kiếm như "tionpete" sẽ khớp không chính xác. –

+0

@ ErenErsönmez Cuộc gọi tuyệt vời. –

+0

Ôi Chúa ơi. Các bạn rất đúng. Tôi đã làm ngược lại và cứ nhìn chằm chằm vào những chỗ sai. – codingjoe

0

dùng thử Mã này.

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); 
} 
}  
Các vấn đề liên quan