Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql EF 4.0 Linq在使用string.contains和变量而不是硬编码字符串时生成奇怪的查询_Linq To Sql_C# 4.0_Entity Framework 4 - Fatal编程技术网

Linq to sql EF 4.0 Linq在使用string.contains和变量而不是硬编码字符串时生成奇怪的查询

Linq to sql EF 4.0 Linq在使用string.contains和变量而不是硬编码字符串时生成奇怪的查询,linq-to-sql,c#-4.0,entity-framework-4,Linq To Sql,C# 4.0,Entity Framework 4,当我使用以下代码块(C#)时: linq生成以下查询: SELECT * FROM [SET] AS [Extent1] WHERE [Extent1].[Email] LIKE '%Mail@gmail.com%' SELECT * FROM [Set] AS [Extent1] WHERE [Extent1].[Email] LIKE @p__linq__0 ESCAPE N'~' 当我使用以下代码块时: string email = "Mail@gmail.com"; var quer

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

linq生成以下查询:

SELECT *
FROM [SET] AS [Extent1]
WHERE [Extent1].[Email] LIKE '%Mail@gmail.com%'
SELECT *
FROM [Set] AS [Extent1]
WHERE [Extent1].[Email] LIKE @p__linq__0 ESCAPE N'~'
当我使用以下代码块时:

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 '%Mail@gmail.com%'
SELECT *
FROM [Set] AS [Extent1]
WHERE [Extent1].[Email] LIKE @p__linq__0 ESCAPE N'~'

如何让linq像第一种情况一样生成查询,而不将字符串硬编码,而是作为字符串参数传递?

您看到的结果与实际情况相同。原因是,Linq正确地将字符串文字标识为硬编码,并假设它不受SQL注入和捕获的约束(即,它是常量,在运行延迟查询时不会是不同的值)

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

但是,如果您确定要覆盖此最佳实践(因为您知道得更好?=),则可以遍历表达式树以查找变量access,并用ConstantPression替换节点。我相信这将导致linq按照您的观察对查询进行硬编码


注意
VisitMemberAccess
方法,并查看一下。

您看到的结果与实际情况相符。原因是,Linq正确地将字符串文字标识为硬编码,并假设它不受SQL注入和捕获的约束(即,它是常量,在运行延迟查询时不会是不同的值)

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

但是,如果您确定要覆盖此最佳实践(因为您知道得更好?=),则可以遍历表达式树以查找变量access,并用ConstantPression替换节点。我相信这将导致linq按照您的观察对查询进行硬编码


请注意
VisitMemberAccess
方法,并查看。

为什么要使用此方法?我认为数据库中第一个查询的性能要比第二个好得多。我也体验到了巨大的性能差异。我大约1:5你为什么要这个?我认为数据库中第一个查询的性能要比第二个好得多。我也体验到了巨大的性能差异。大约是1:5,对于meall,我试图实现的是更好的性能,服务器回复第一个查询所需的时间是70毫秒,第二个查询所需的时间是344毫秒。还有什么方法可以在传递字符串之前不知道字符串的值就获得更好的性能?很有趣。你能连续地、整体地再现性能差异吗?你能创建一个小的测试项目来展示这一点吗?两者之间的唯一区别应该是计算表达式所需的时间。如果是这样的话,请看一看。希望他们能帮忙!基本上,您只需要一个数据库,它包含一个至少有一列varchar或nvarchar类型的表,并以与post中的查询相同的格式执行2个查询。只是在运行查询之前不要忘记包含客户端统计信息。我所要做的就是获得更好的性能,服务器回复第一个查询所需的时间为70毫秒,第二个查询所需的时间为344毫秒。在传递字符串之前,是否有任何方法可以在不知道字符串值的情况下获得更好的性能?很有趣。你能连续地、整体地再现性能差异吗?你能创建一个小的测试项目来展示这一点吗?两者之间的唯一区别应该是计算表达式所需的时间。如果是这样的话,请看一看。希望他们能帮忙!基本上,您所需要的就是一个数据库,它包含一个至少有一列varchar或nvarchar类型的表,并以与post中的查询相同的格式执行2个查询。只是在运行查询之前不要忘记包含客户端统计信息。