1

当我使用以下代码块(C#)时:

var query = context.Set.Where(o => o.Email.Contains("Mail@gmail.com"));
var stringQuery = ((System.Data.Objects.ObjectQuery)query).ToTraceString();

linq 生成以下查询:

SELECT *
FROM [SET] AS [Extent1]
WHERE [Extent1].[Email] LIKE '%Mail@gmail.com%'

当我使用以下代码块时:

string email = "Mail@gmail.com";
var query = context.Set.Where(o => o.Email.Contains(email));
var stringQuery = ((System.Data.Objects.ObjectQuery)query).ToTraceString();

linq 生成以下查询:

SELECT *
FROM [Set] AS [Extent1]
WHERE [Extent1].[Email] LIKE @p__linq__0 ESCAPE N'~'

如何让 linq 在第一种情况下生成查询而不对字符串进行硬编码,而是作为字符串参数传递?

4

1 回答 1

1

你看到的结果应该是这样的。原因是,Linq 正确地将字符串文字识别为硬编码,并假定它不受 SQL 注入和捕获的影响(即它是恒定的,并且在运行延迟查询时不会是不同的值)。

类似地,它正确地识别出变量可以变化,并且它可以是用户输入。它使用参数化查询,这是针对此类情况的建议/最佳实践。

但是,如果您确定要覆盖此最佳实践(因为您知道得更好?)=),那么您可以遍历表达式树以查找变量访问并用 ConstantExpression 替换节点。我相信这会导致 linq 对查询进行硬编码,正如您所观察到的那样。

MSDN - 表达式树访问者

注意VisitMemberAccess方法,看看ConstantExpression MemberExpression

于 2012-07-17T09:25:57.090 回答