如何在 Linq-to-Entities 中完全模拟 SQL Like 的行为

How to fully simulate the behavior of a SQL Like in Linq-to-Entities

我希望在 Linq-to-Entities 中完全模拟 SQL Like 的行为。

我不想使用 StartsWith、EndsWith 或 Contains,它们在原始查询为:

时无法正常工作
t_test LIKE '%';

我也不能在 SqlFunctions 中使用 Linq-to-SQL 方法,因为我并不总是在 Entity 上使用 SQL 环境(尤其是在使用模拟 DbContext 测试我的存储库时)。

在我的主要案例中,实体被插入到 Oracle SQL 数据库中。

到目前为止,我已经在我的 Where 子句中尝试了这个 lambda(我使用“*”作为转义字符而不是“%”):

x => (testName.StartsWith("*") && testName.EndsWith("*") &&
                         x.Name.Contains(testName.Replace("*", "")) ||
                         testName.StartsWith("*") &&
                         x.Name.EndsWith(testName.Replace("*", "")) ||
                         testName.EndsWith("*") &&
                         x.Name.StartsWith(testName.Replace("*", ""))))

实体在以下 Oracle SQL 查询中对此进行翻译:

SELECT 
"Extent1"."KEY" AS "KEY", 
"Extent1"."NAME" AS "NAME", 
FROM "T_NAME" "Extent1"
WHERE ((('*' LIKE '*%') AND ('*' LIKE '%*') AND (( NVL(INSTR("Extent1"."NAME", REPLACE('*', '*', '')), 0) ) > 0)));

没有 return 任何东西。

任何线索或帮助都会很棒。

终于找到问题了

实际上,testName.Replace("*", "") 似乎被误解了。在 Linq 之外进行处理时,构建的 SQL 查询是正确的,一切正常。

更正:

string correctName = testName.Replace("*", "");

x => (testName.StartsWith("*") && testName.EndsWith("*") &&
                         x.Name.Contains(correctName) ||
                         testName.StartsWith("*") &&
                         x.Name.EndsWith(correctName) ||
                         testName.EndsWith("*") &&
                         x.Name.StartsWith(correctName)))

由此得出的SQL是:

SELECT
"Extent1"."KEY" AS "KEY", 
"Extent1"."NAME" AS "NAME",
FROM "T_NAME" "Extent1"
WHERE (('*' LIKE '*%') AND ('*' LIKE '%*') AND ("Extent1"."NAME" LIKE "%%" ESCAPE '\'))

现在一切正常。