如何在Linq to EF语句中嵌入可选的Where参数?

时间:2012-08-23 11:07:30

标签: entity-framework entity-framework-4.1

假设我的表单上有一个带有可选复选框的说明字段。复选框表示执行查找时要搜索的字段。现在我有一个查找矩阵,可以调用where子句的唯一版本。它可以工作,但我认为闻起来一点。

这是一段摘录

    // Look for part numbers decide how many fields to search and use that one.
    // 0 0 X
    if (!PartOpt[0] && !PartOpt[1] && PartOpt[2])
    {
     query = query.Where(p => (p.PartNumAlt2.Contains(partSearchRec.inventory.PartNum)));
    }
    // 0 X 0
    if (!PartOpt[0] && PartOpt[1] && !PartOpt[2])
    { 
      query = query.Where(p => (p.PartNumAlt.Contains(partSearchRec.inventory.PartNum)));
    }
    // 0 X X
    if (!PartOpt[0] && PartOpt[1] && PartOpt[2])
    {
      query = query.Where(p => (p.PartNumAlt.Contains(partSearchRec.inventory.PartNum)
        || p.PartNumAlt2.Contains(partSearchRec.inventory.PartNum)));
    }
    // X 0 0
    if (PartOpt[0] && !PartOpt[1] && !PartOpt[2])
    {
      query = query.Where(p => (p.PartNum.Contains(partSearchRec.inventory.PartNum)));
    }
     . . .

这种情况持续了一段时间,似乎容易出现编码错误。在每种情况下,我们都在任何选定的字段中查找相同的信息。如果我在SQL中这样做,我可以根据需要简单地构建WHERE子句。

1 个答案:

答案 0 :(得分:0)

我再次橡皮筋回避答案。而不是抛出问题,这是我想出的。它有效吗?

if (partSearchRec.optPartNum || partSearchRec.optAltPartNum1 || partSearchRec.optAltPartNum2)
{
  query = query.Where(p => (
       (partSearchRec.optPartNum && p.PartNum.Contains(partSearchRec.inventory.PartNum))
    || (partSearchRec.optAltPartNum1 && p.PartNumAlt.Contains(partSearchRec.inventory.PartNum))
    || (partSearchRec.optAltPartNum2 && p.PartNumAlt2.Contains(partSearchRec.inventory.PartNum))));
}

基本上,如果设置了任何复选框,我们将执行查询。仅在选中复选框时才会处理查询的每一行。如果AND的左侧为假,则它不会处理右侧。

这是Delphi的with声明会很方便的一个例子。我还了解到你不能在LINQ语句中使用数组。