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 实体框架:结合精确搜索和通配符搜索条件_Entity Framework_Linq To Entities_Match_Wildcard - Fatal编程技术网

Entity framework 实体框架:结合精确搜索和通配符搜索条件

Entity framework 实体框架:结合精确搜索和通配符搜索条件,entity-framework,linq-to-entities,match,wildcard,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.Contains(searchValue)); 但我希望两者都能

我正在创建一个查询来使用EF搜索数据库。TdsDb是EF上下文

string searchValue = "Widget";
TdsDb tdsDb = new TdsDb();
IQueryable<Counterparty> counterparties;
或通配符匹配:

counterparties = tdsDb.Counterparties.Where(x => x.CounterpartyName.Contains(searchValue));
但我希望两者都能做到,即(psudo代码)

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


有什么想法吗?

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

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

顺便问一下,您是否测试了通过在开始或结束时具有
%
搜索值进行查询是否如您所期望的那样有效?可能会将
%
作为要查询的字符进行转义,因为
StartsWith
Contains
将在生成的SQL搜索项前添加/附加
%
通配符。在这种情况下,在将
搜索值传递到
StartsWith
Contains

目录之前,您需要从
搜索值中切断
%
,它们难道不是最好的吗?谢谢Slauma,这很有效,是的,我已经允许删除通配符了。非常非常有用,非常感谢。
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}
      );
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));