簡體   English   中英

SQL字寬“%like%”使用lambda表達式在Entity Framework 6中搜索

[英]SQL word wide “%like%” search in Entity Framework 6 using lambda expression

我有一個SQL查詢如下所示,我必須在C#中的實體框架中編寫一個等效的查詢。 我必須在表之間建立連接,並且我必須對搜索字符串中的每個單詞使用SQL LIKE運算符。 在給定的示例中,搜索字符串是“Life-Span Development 16E 99 Subject Index”。 我一直在嘗試為此編寫c#代碼但無法達到預期的結果。 你能幫我把SQL查詢轉換成Entity框架等價查詢嗎?

SQL查詢:

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%')

* C#代碼:

static void Main(string[] args)
{
    string searchText = "Life-Span Development 16E 99 Subject Index";

    using (Entities db = new Entities())
    {
        var result = db.titles
                    .Join(db.assets,
                            p => p.tid,
                            e => e.tid,
                            (p, e) => new {
                                 title = p.title1,
                                 fileName = e.filename
                            });               

        var searchTextArray = searchText.ToLower().Split(' ');
        result = result.Where(t => searchTextArray.Any(s => t.title.ToLower().Contains(s)));

        foreach(var item in result)
        {
            Console.WriteLine(string.Format("Title = {0} and finename = {1}", item.title, item.fileName));
        }
    }

    Console.ReadKey();
}

這是您的問題的根源:

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()如果所有元素(返回true searchTextArray )有符合(在thise情況下,如果所有searchTextArray元素都包含在一個給定的title )。 它是使用AND的SQL等價物。

根據更新的故障模式(結果太多),將.Any更改為.All:

    result = result.Where(t => searchTextArray.All(s => t.title.ToLower().Contains(s)));

有點笨重,但它做的工作

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

產量

真正

真正

您可以使用SqlMethods.Like

將您的searchText變量更新為 -

string searchText = "Life-Span%Development%16E%99%Subject%Index";

刪除此代碼行 -

var searchTextArray = searchText.ToLower().Split(' ');

然后將resultsWhere條件更新為

results = from r in results 
              where SqlMethods.Like(r.title,searchText )
              select r;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM