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 构造中。
我正在设计一个由 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 构造中。