在LINQ where子句上混淆

时间:2014-04-09 12:53:07

标签: linq asp.net-mvc-4

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)对我来说有点混乱。逻辑是:“如果category为null,则只选择所选类别”。 这是一本书,但这是写这个的最好方法吗? 它说类别可以是“null或类别值”。因此,如果category包含一个值,它将使用该值来选择项而不是null(null选择所有项)。 我写了这个有点无用,但有效并且更清楚:

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

我的逻辑是否正确?

3 个答案:

答案 0 :(得分:4)

它基本上允许类别过滤器是可选的 - 如果category参数非空,那么它必须匹配您正在查看的任何内容。否则,只需包括所有类别。

答案 1 :(得分:1)

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

这里有两个部分,通过OR连接,这意味着其中一个必须是true,以产生true

category == null 

给出的类别为空

p.Category == category

有问题的类别符合给定的类别

因此,如果给定的类别为nu​​ll,或者它与p的类别匹配,它将选择p

答案 2 :(得分: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

Ternary将返回一个bool,而不是构造SQL查询的条件

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