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

时间:2014-10-04 06:35:50

标签: c# lambda

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

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")),但这只会照顾上面的第一个条件。

1 个答案:

答案 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();