如何像在 Linq to-Entity 中一样完全模拟 SQL 的行为



我希望完全模拟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 ''))

现在一切正常。

最新更新