2014-04-09 105 views
0
public ViewResult List(string category, int page = 1) 
{ 
    ProductsListViewModel viewModel = new ProductsListViewModel 
    { 
     Products = repository.Products 
      .Where(p => category == null || p.Category == category) 
      ........... 

該行:.Where(p => category == null || p.Category == category)對我有點困惑。邏輯是:「如果類別爲空,則只選擇所選類別」。 這是來自一本書,但這是寫這個最好的方法嗎? 這是說類別可以是「null或類別值」。所以如果類別包含一個值,它將使用該值來選擇項目而不是null(null選擇所有項目)。 我寫這這是一種無用的,但工作,並作出更明確的:混淆LINQ where子句

.Where(p => category == null ? category == null : 
           p.Category == category) 

我會收到這個邏輯嗎?

+0

我不不認爲你的更清楚。也許如果你用true替換了第二次使用'category == null',它可能是...... – Chris

+0

像喬恩說的那樣,它允許類別是可選的。如果類別爲空,它會短路並選擇全部。 – Sinaesthetic

+0

謝謝大家。 。是的,在考慮到短路的情況下,現在就清楚了。我想我認爲它需要有條件。 –

回答

4

它基本上允許類別過濾器是可選的 - 如果參數category非空,那麼它必須匹配您正在查看的任何內容。否則,只包括所有類別。

1
.Where(p => category == null || p.Category == category) 

有兩個部分在這裏,由一個OR,這意味着他們之一必須是true,導致true連接:

category == null 

給出的類別爲空

p.Category == category 

有問題的類別與給定的類別相匹配

所以它會選擇一個p,如果給出的類別爲空,或者它與p的類別相匹配。

1
.Where(p => category == null || p.Category == category) 

將被轉換爲SQL查詢這樣的事情(不完全):

where null is null or Category == null // When not specified, show all because, null IS null = true 
// or 
where 'someCategory' is null or Category == 'SomeCategoy' // filter by some category 

三元將返回一個bool,而不是條件來構造SQL查詢

category == null ? category == null : p.Category == category