![](/img/trans.png)
[英]Conversion of SQL group by to Entity Framework Lambda expression
[英]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(' ');
然后將results
的Where
條件更新為
results = from r in results
where SqlMethods.Like(r.title,searchText )
select r;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.