Lambda表达式,根据复选框值检索数据库行

本文关键字:检索 数据库 复选框 表达式 Lambda | 更新日期: 2023-09-27 18:25:35

我有一个包含产品模型的数据库表。所有型号名称都遵循严格的命名法。我正在处理的代码位置是模型名称的最后一个字符,我只需要使用以下标准检索这些模型名称:

Last char == "E"
Last char <> "E"
All model names

UI上有两个复选框。必须至少勾选一个复选框。用户也可以勾选这两项。如果两个复选框都勾选,则需要返回所有产品型号。如果勾选了一个复选框,则只应返回以"E"结尾的产品型号。如果勾选了其他复选框,则应返回未以"E"结尾的产品型号。有点像,是真是假,或者两者兼而有之。

Only product models ending with "E"       model.checkbox1 && !model.checkbox2;
Only product models not ending with "E"   !model.checkbox1 && model.checkbox2;
All product models                        model.checkbox1 && model.checkbox2;

有没有办法将上述逻辑组合成一个Lambda表达式?我现有的Lambda检索所有产品型号是:

IList<SelectListItem> items = db.Products
    .Select(m => new SelectListItem() { Text = m.Name, Value = m.Id.ToString() })
    .ToList();

我知道我可以使用.Where(m => m.Name.EndsWith("E")),但它只满足上面的第一个条件。

Lambda表达式,根据复选框值检索数据库行

首先,给事物起一个更有意义的名字:

modelsEndingWithE    =  model.checkbox1 && !model.checkbox2;
modelsEndingWithoutE  = !model.checkbox1 && model.checkbox2;
allModels  = modelsEndingWithE && modelsEndingWithoutE;

三元表达式可以使用,但仅用于理论意义。在生产代码中看到这一点会被解雇:-)。

.Where(m => (allModels) ? true : // true - select all.
              (modelsEndingWithoutE) ?  // otherwise
                 !m.Name.EndsWith("E") : // all elements not ending with 'E'
                  m.Name.EndsWith("E")); // all elements ending with E

第二种方法是使用短路。

.Where(x => allModels || (modelsEndingWithE && x.Name.EndsWith("E")) ||
             (modelsEndingWithoutE && !x.Name.EndsWith("E"))

第三种方法是逐步组成查询。

IQueryable<SelectListItem> query = db.Products;
if(!allModels)
{
  if(modelsEndingWithE) query = query.Where(model => model.Name.EndsWith("E"));
  if(modelsEndingWithoutE) query = query.Where(model => !model.Name.EndsWith("E"));
}
query = query.Select(m => new SelectListItem() { Text = m.Name, Value = m.Id.ToString() })
IList<SelectListItem> results= query.ToList();