2

我正在创建一个查询来使用 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));

但我希望能够做到这两点,即(伪代码)

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}
      );

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

有任何想法吗?

4

1 回答 1

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));

如果按开头或结尾的 a 查询是否按预期工作,您是否测试过searchValue%可能会将其转义为要查询的字符,%因为无论如何都会在生成的 SQL 搜索词之前添加/附加通配符。在这种情况下,您需要在将其传递到or之前将其从中切断。StartsWithContains%%searchValueStartsWithContains

于 2012-09-20T17:35:14.057 回答