我有一个如下所示的SQL查询,我必须在C#中的Entity Framework中编写一个等效的查询。我必须在表之间建立连接,并且必须对搜索字符串中的每个单词使用SQL std::string names[6]; // Global variable
extern "C"
JNIEXPORT void JNICALL
Java_com_erikbylow_mycamera3_JNIUtils_updateStandingBoard(JNIEnv *env, jobject type, std::string *names, jint nbrElements){
memcpy(standingText, names, 6* sizeof(std::string));
nbrStandText = nbrElements;
}
In `Java`:
public static void updateStanding( String resultArray[]){
updateStandingBoard(resultArray, resultArray.length);
}
运算符。在给定的示例中,搜索字符串是“ Life-Span Development 16E 99 Subject Index”。我一直试图为此编写C#代码,但无法达到预期的结果。您能帮我将SQL查询转换为等效于Entity Framework的查询吗?
SQL查询:
LIKE
* C#代码:
SELECT
[titles].[title],
[assets].[filename]
FROM
titles
INNER JOIN
assets ON titles.ID = assets.ID
WHERE
(title LIKE '%Life-Span%'
AND title LIKE '%Development%'
AND title LIKE '%16E%'
AND title LIKE '%99%'
AND title LIKE '%Subject%'
AND title LIKE '%Index%')
答案 0 :(得分:2)
这是问题的根源:
result = result.Where(t => searchTextArray.Any(s => t.title.ToLower().Contains(s)));
如果找到一个匹配项(或更多),则 Any()
返回true(或者,但在一个匹配项之后停止检查)。与使用OR
的SQL等效。
您想要的是什么
result = result.Where(t => searchTextArray.All(s => t.title.ToLower().Contains(s)));
如果所有元素(在All()
中)相匹配(在这种情况下,如果所有searchTextArray
元素都包含在给定的{中,则 searchTextArray
返回true {1}})。与使用title
的SQL等效。
答案 1 :(得分:1)
根据更新的失败模式(结果过多),将.Any更改为.All:
result = result.Where(t => searchTextArray.All(s => t.title.ToLower().Contains(s)));
答案 2 :(得分:0)
有些笨拙,但确实可以完成工作
namespace Like
{
class Program
{
static bool Is(char a, char b)
{
return a == b ||
char.ToUpper(a) == b ||
char.ToUpper(b) == a;
}
static bool IsLike(string sample, string query)
{
int k = 0;
foreach (char c in sample)
{
if (!Is(c, query[k]))
{
k = 0;
continue;
}
if (++k == query.Length)
return true;
}
return false;
}
static void Main(string[] args)
{
string testSample = "This is a str1ng 0f charac7er5";
Console.WriteLine(IsLike(testSample, "this"));
Console.WriteLine(IsLike(testSample, "of"));
Console.WriteLine(IsLike(testSample, "chAra"));
Console.ReadKey();
}
}
}
产量
是
假
TRUE
答案 3 :(得分:0)
您可以使用SqlMethods.Like。
将您的searchText
变量更新为-
string searchText = "Life-Span%Development%16E%99%Subject%Index";
删除此代码行-
var searchTextArray = searchText.ToLower().Split(' ');
然后将Where
中的results
条件更新为
results = from r in results
where SqlMethods.Like(r.title,searchText )
select r;