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

时间:2019-06-13 15:29:10

标签: c# sql entity-framework linq 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)));

不返回任何内容。

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

1 个答案:

答案 0 :(得分:1)

我终于找到了问题。

从根本上来说,似乎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 '\'))

现在一切正常。