我有一个包含产品型号的数据库表。所有型号名称都遵循严格的命名法。我正在处理的代码位置是模型名称的最后一个字符,我需要使用以下条件仅检索那些模型名称:
Last char == "E"
Last char <> "E"
All model names
UI上有2个复选框。必须至少勾选一个复选框。用户也可以勾选两者。如果勾选了两个复选框,则需要返回所有产品型号。如果勾选了一个复选框,那么只有那些以&#34; E&#34;结尾的产品型号。应该退还。如果勾选了另一个复选框,那么产品型号不会以&#34; E&#34;应该退还。有点像,真或假,或两者兼而有之。
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"))
,但这只会照顾上面的第一个条件。
答案 0 :(得分:2)
首先,给一些更有意义的名字:
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();