如何在 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 '\'))
现在一切正常。
我希望在 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 '\'))
现在一切正常。