2016-02-06 31 views
0

我不明白爲什麼這個查詢不起作用,你能幫我嗎?Linq空參數不起作用

public static IEnumerable<SelectListItem> MyList(int? id, string name="") 
{ 
var list =db.Entity 
    .Where(p=> 
      (name==null? p.Name !=null : p.Name==name) && 
      (id.hasValue || p.Id==id) 
    .Select(n=>new SelectListItem() 
      { 
      Text=n.Name, 
      Value=n.Id.ToString() 
      }).ToList(); 
return list; 
} 

我希望在兩個參數都爲空時列出完整列表!但是當兩個參數都爲空時我會得到一個空列表。

片段代碼來自一個包含幾個像這樣的查詢的大方法。

+0

你大概的意思'(!id.HasValue || p.Id == ID)' – Rhumborl

+1

你真的確認你與兩個參數'null'測試?可疑的是,您將'name'的默認值設置爲空字符串,這幾乎肯定不會匹配任何記錄。 – hvd

+0

我認爲它應該是'id.hasValue && p.Id == id' – Shaharyar

回答

7

如果我理解正確,您不想在值爲null時執行過濾。然後,你應該寫:

.Where(p=> 
      (name == null || p.Name == name) && 
      (id == null || p.Id == id) 

你應該改變函數的簽名爲參數name默認值設置爲null,而不是空字符串。

public static IEnumerable<SelectListItem> MyList(int? id, string name = null) 
5

%的意見,有兩個問題:

首先,你對id條件是不完全正確。其次,name的默認參數是一個空字符串,而不是null

然而,有空間可以容納更多的改進:通過在查詢中嵌入您的name == null(和同爲id),您的查詢將在翻譯的null檢查SQL的方式來構建。這很好,如果在查詢構建完畢後有name更改其值的機會,但這裏沒有發生這種情況的機會。您可以改爲動態構建您的查詢:

我註釋了p.Name != null檢查。如果你的名字可能是null,那麼根據這個問題,你不希望它們在name == null時被過濾掉。

public static IEnumerable<SelectListItem> MyList(int? id, string name=null) 
{ 
    IQueryable<Entity> query = db.Entity; 
    if (id != null) 
    query = query.Where(p => p.Id == id); 
    if (name != null) 
    query = query.Where(p => p.Name == name); 
    //else 
    // query = query.Where(p => p.Name != null); 
    return query.Select(...).ToList(); 
} 
+0

謝謝你的回答 –