2014-07-24 77 views
0

比方說,我有一個方法的5個參數,這些是說,3個不同的表中的列。方法調用者可以將null傳遞給所有參數。部分我的Linq如下用所有參數選擇

public Customer GetCustomer(int id, DateTime? dob, string FName, string MI, string LName) 
{ 
    query = (from customer in CustomerDb.customers 
      join 
      ,... 
      where cpn.FirstName == FName && cpn.LName == LName 
      .. 
      select customer); 
} 

現在如果他們只提供一個FName,我希望我的where子句只包含FName屬性。而且,如果 - 其他或切換大小寫的唯一方法來實現這一目標?我不能把一切都放在查詢中,因爲如果他們只提供一個FName,我會在dob,id,MI和LName中尋找空值。而且他們可以將null傳遞給所有值(在int情況下爲0),這意味着我需要返回DB中的所有內容,而不是空值的AND。

+0

任何阻止您在設置查詢後將where語句添加到'IQueryable'的事情? –

回答

2

你可以簡單地延長你在哪裏佔默認值:

where (FName == null || cpn.FirstName == FName) && (LName == null || cpn.LName == LName) 

它將複雜的地方一點點,但我看不出有任何理由爲什麼要失敗或表現不佳。

+1

唯一的問題是我的(不可空)整數字段。如果他們傳遞一個零,我不想用零查詢。我甚至不想在我的查詢中找到該字段。 – user3726933

+0

如果你的整數不能爲空,那麼你如何區分是否需要搜索0或不? 0對於「不搜索」的id有特殊含義嗎?如果是這種情況,你可以使用相同的結構(id == 0 || cpn.ID == id) –

1

我需要返回數據庫中的所有內容,而不是空值的AND。

使用lambda:

public Customer GetCustomer(int? id, DateTime? dob, string fName, 
    string mi, string lName) 
{  
    IQuerable<Customer> query = CustomerDb.customers; 

    if (id.HasValue) 
    { 
    query = query.Where(c => c.id == id.Value) 
    } 
    else 
    { 
    query = query.Where(c => c.id == null)  
    } 

    if (dob.HasValue) 
    { 
    query = query.Where(c => c.Dob == dob.Value) 
    } 
    else 
    { 
    query = query.Where(c => c.Dob == null)  
    } 

    if (!string.IsNullOrWhitespace(fName)) 
    { 
    query = query.Where(c => c.FName == fName) 
    } 
    else 
    { 
    query = query.Where(c => c.Fname == null)  
    } 

    // repeat for mi, lName 

    var result = query.FirstOrDefault(); 

    return result; 
} 

如果你不想在沒有經過過濾的值,只需刪除您選擇的else語句(S)。