2017-04-17 79 views
0

我有這段旨在搜索數據庫的代碼。用戶在這裏應該有3個選項:只輸入姓氏,名字和用戶可以使用他們的姓氏和名字進行搜索。搜索中的非必填字段

如果我同時提供字符串 - 姓氏和名字,此代碼將從我的數據庫中檢索記錄。但是如果我只輸入其中的一個,我的結果列表總是空的。

var query = from x in db.people 
        where (txtSurname == null || x.Surname== txtSurname.Text) 
         && (txtFirstName == null || x.FirstName == txtFirstName.Text) 
        select x; 
     var data = query.ToList(); 
     peopleBindingSource.DataSource = data; 

回答

5

記住,直到兌現的數據問心無愧ToList或遍歷它的例子,實體框架查詢不會被髮送到數據庫。這意味着您可以使用如下代碼構建查詢:

var query = db.people.AsQueryable(); 

if(!string.IsNullOrEmpty(txtSurname.Text)) 
{ 
    query = query.Where(p => p.Surname == txtSurname.Text); 
} 

if(!string.IsNullOrEmpty(txtFirstName.Text)) 
{ 
    query = query.Where(p => p.FirstName == txtFirstName.Text); 
} 

peopleBindingSource.DataSource = query.ToList(); 
+1

使用此方法也可能會生成更好的緩存查詢計劃。由於參數嗅探來自先前運行的大多數未使用的字段,因此您不會收到錯誤的索引。 –

+0

如果在問題中進行比較檢查,則這不完全相同。如果(txtSurname == null),你只是檢查是否(txtSurname.Text)。 – David

+0

@大衛是的,但我懷疑這是造成原始問題的錯字。 – DavidG