我希望完全模拟SQL的行为,就像在Linq-to-Entities中一样。
我不想使用StartsWith,EndsWith or Contains,当原始查询为
:t_test LIKE '%';
我也不能在 SqlFunctions 中使用 Linq-to-SQL 方法,因为我并不总是在实体上使用 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)));
它不返回任何内容。
任何线索或帮助都会很棒。
我终于找到了问题所在。
从字面上看,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 ''))
现在一切正常。