LINQ 和可选参数

LINQ and optional parameters

我正在设计一个由 MVC 应用程序使用的 Web 服务(非常简单的东西),但我需要 Web 服务中的一个方法最多接受四个可选参数(即 catId、brandId、lowestPrice 和最高价)。

我如何编写 Linq 查询以使其真正执行

databaseObject.Products.Where(p=> (p.Category == ANY if catId==null, else catId))

我希望这是有道理的。

databaseObject.Products.Where(p=> ((catId==null) ||  (p.Category == catId)))

对于其他 3 个可选参数,您可以将它们与一起,在一个 linq 语句中完成整个搜索。

以下内容应该可以解决问题:

IEnumerable<Product> GetProducts(int? categoryId)
{
    var result = databaseObject.Products.Where(product => ProductCategoryPredicate(product, categoryId)
}

/// <summary>
/// Returns true if the passed in categoryId is NULL
/// OR if it's not null, if the passed in categoryId matches that
/// of the passed in product
///
/// This method will get called once for each product returned from 
/// databaseObject.Products</summary>
bool ProductCategoryPredicate(Product product, int? categoryId)
{
    if (categoryId.HasValue)
    {
        return product.Category == categoryId.Value;
    }
    else
    {
        return true;
    }
}

这个 could/can 可以简化为一行 LINQ 语句(见下文),但为了清楚起见,我在上面写了它:

IEnumerable<Product> GetProducts(int? categoryId)
{
    var result = databaseObject.Products.Where(product => !categoryId.HasValue || product.Category == categoryId.Value);
}

该方法的参数可以接受空值,并且可以为每个非空参数评估 Where 限制:

IQueryable<Product> q = databaseObject.Products;

if (catId != null)
{
    q = q.Where(p => p.Category == catId);
}
if (brandId != null)
{
    q = q.Where(p => p.Brand == brandId);
}
// etc. the other parameters

var result = q.ToList();

如果这是 Linq To SQL:

databaseObject.Products.Where(p=> (catId == null || p.Category == catId) );

Linq To SQL,如果 CatId 为空,则无需 where 子句即可有效地写入发送到后端的 SQL。您可以有多个这样的构造,只有那些具有非 Null 值的构造才会包含在 where 构造中。