Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何在Linq to EF语句中嵌入可选Where参数?_Entity Framework_Entity Framework 4.1 - Fatal编程技术网

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

Entity framework 如何在Linq to EF语句中嵌入可选Where参数?,entity-framework,entity-framework-4.1,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])

假设我的表单上有一个带有可选复选框的描述字段。复选框表示执行查找时要搜索的字段。现在我有一个查找矩阵,它调用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子句。

我再一次躲开,找到了答案。与其把这个问题抛在脑后,不如说我想到了这个问题。效率高吗

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的左侧为false,则不处理右侧


这是一个领域,德尔福的
语句将非常方便。我还了解到不能在LINQ语句中使用数组

它是有效的,但坏的是每个谓词(包括
optPartNum
s)总是查询的一部分,这使得查询优化器很难找到有效的执行计划。我还看到使用
Union
解决了堆叠的
查询。(
if(opt)query=query.Union(…