使用lambda表达式在Entity Framework 6中进行SQL词宽“%like%”搜索

时间:2018-07-16 19:13:01

标签: c# entity-framework linq entity-framework-6

我有一个如下所示的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%')

4 个答案:

答案 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;