如何在表SomeTable
中用C#编写linq查询,其中MyCol
包含列表中的所有单词?有没有办法轻松为此写一个Like语句?
我在互联网上搜索了我的问题的答案,但是找不到合适的东西。
在Linq中,有contains
,startsWith
和endsWith
方法。如果我有一个SQL语句,这些确实很有帮助:
select * from SomeTable where Col_1 like '%cat' or Col_2 like 'dog%' or Col_3 like '%Random%'
但是。我所拥有的是这样的陈述:
declare @Wild_Name varchar(500) = 'my cat likes dogs'
set @Wild_Name='%'+REPLACE(@Wild_Name,' ','%')
这实际上会导致@Wild_Name
等于%my%cat%likes%dogs
,现在我在这句话中按顺序搜索这些单词中的每一个:
select * from SomeTable where MyCol like @WildName
此查询可以提取的结果是That's my cat. He really likes black dogs
我是以错误的方式解决这个问题吗?
答案 0 :(得分:1)
这绝对是可能的,尽管LINQ中没有“赞”。
这样的事情可以解决问题:
string wild_name = "my cat likes dogs";
string test_string = "That's my cat. He really likes black dogs";
bool match = wild_name.Split(' ').All( w => test_string.Split(' ').Contains(w));
pre-splitting test_string可能会提升性能(因为你只拆分一次)。此外,这假设所有单词都以空格分隔。
确保它们按正确顺序排列:
string wild_name = "my cat likes dogs";
string test_string = "That's my cat. He really likes black dogs";
string[] wildStrings = wild_name.Split(' ');
int lastFoundIndex = 0;
bool success = true;
for (int i = 0; i < wildStrings.Length; i++)
{
if (test_string.Split(' ').Contains(wildStrings[i])
{
int findIndex = test_string.Split(' ').IndexOf(wildStrings[i]);
if (findIndex < lastFoundIndex)
{
success = false;
break;
}
}
else
{
success = false;
break;
}
}
return success;
我无法想出一种“纯粹的”LINQ方式,但也许它可以帮助你提出一些想法!
让我知道我是否可以澄清任何事情!