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)
我的逻辑是否正确?
答案 0 :(得分:4)
它基本上允许类别过滤器是可选的 - 如果category
参数非空,那么它必须匹配您正在查看的任何内容。否则,只需包括所有类别。
答案 1 :(得分:1)
.Where(p => category == null || p.Category == category)
这里有两个部分,通过OR连接,这意味着其中一个必须是true
,以产生true
:
category == null
给出的类别为空
p.Category == category
有问题的类别符合给定的类别
因此,如果给定的类别为null,或者它与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