Entity framework 实体框架:结合精确搜索和通配符搜索条件
我正在创建一个查询来使用EF搜索数据库。TdsDb是EF上下文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)); 但我希望两者都能
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));