实体框架:结合搜索术语的精确搜索和通配符搜索

时间:2012-09-20 16:40:05

标签: entity-framework linq-to-entities match wildcard

我正在创建一个使用EF搜索数据库的查询。 TdsDb是EF背景。

string searchValue = "Widget";
TdsDb tdsDb = new TdsDb();
IQueryable<Counterparty> counterparties;

我可以完全匹配:

counterparties = tdsDb.Counterparties.Where(x => x.CounterpartyName == searchValue);

或通配符匹配:

counterparties = tdsDb.Counterparties.Where(x => x.CounterpartyName.Contains(searchValue));

但我希望能够同时做两个(psudo代码)

counterparties = tdsDb.Counterparties.Where(x => 
          if (searchValue.EndsWith("%")) 
                 {
                      if (searchValue.StartsWith("%"))
                          {x.CounterpartyName.Contains(searchValue)}
                      else 
                          {x.CounterpartyName.StartsWith(searchValue)}
                 }   
          else
                 {x => x.CounterpartyName == searchValue}
      );

现在显然我不能在if子句中添加if语句。但我也无法复制查询:这里显示他们非常愚蠢。生产查询的时间要长得多,因此只有一个子句的同一长查询的多个版本似乎非常不健康且不可维护。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您应该能够使用三元运算符:

bool startsWithWildCard = searchValue.StartsWith("%");
bool endsWithWildCard = searchValue.EndsWith("%");

counterparties = tdsDb.Counterparties.Where(x => 
      endsWithWildCard
          ? (startsWithWildCard
              ?  x.CounterpartyName.Contains(searchValue)
              : (x.CounterpartyName.StartsWith(searchValue)))
          : (x.CounterpartyName == searchValue));

如果您在开头或结尾有一个searchValue的{​​{1}}查询是否按预期工作,您是否测试了btw? %可能会作为要查询的字符进行转义,因为%StartsWith会在生成的SQL搜索字词之前添加/附加Contains通配符。在这种情况下,您需要先从%切断%,然后再将其传递到searchValueStartsWith