Entity framework 如何在Linq to EF语句中嵌入可选Where参数?
假设我的表单上有一个带有可选复选框的描述字段。复选框表示执行查找时要搜索的字段。现在我有一个查找矩阵,它调用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])
// 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(…