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"))
,但它只满足上面的第一个条件。
首先,给事物起一个更有意义的名字:
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();