我看到一些与使用.NET框架版本4的Entity Framework Code-First的非常简单的查询相关的一些非常奇怪的性能.LINQ2Entities查询如下所示:
context.MyTables.Where(m => m.SomeStringProp == stringVar);
Run Code Online (Sandbox Code Playgroud)
这需要超过3000毫秒才能执行.生成的SQL看起来非常简单:
SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = '1234567890'
Run Code Online (Sandbox Code Playgroud)
在通过Management Studio运行时,此查询几乎立即运行.当我更改C#代码以使用SqlQuery函数时,它在5-10毫秒内运行:
context.MyTables.SqlQuery("SELECT [Extent1].[ID] ... WHERE [Extent1].[SomeStringProp] = @param", stringVar);
Run Code Online (Sandbox Code Playgroud)
因此,完全相同的SQL,在两种情况下都会对结果实体进行更改跟踪,但两者之间存在差异.是什么赋予了?
我知道我之前提过了一个相关的问题.我只是想到了另一个想法.
using (SqlConnection conn = new SqlConnection('blah blah'))
{
using(SqlCommand cmd = new SqlCommand(sqlStatement, conn))
{
conn.open();
// *** do I need to put this in using as well? ***
SqlDataReader dr = cmd.ExecuteReader()
{
While(dr.Read())
{
//read here
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
参数是:由于SqlDataReader
dr
对象不是一个新的对象,如连接或命令对象,它只是一个指向cmd.ExecuteReader()
方法的引用,我是否需要将阅读器放在一个using
.(现在基于我以前的帖子,我的理解是任何使用的对象IDisposable
需要放入using
,并SQLDataReader
继承IDisposable
,所以我需要把它.我的判断是否正确?)我只是困惑,因为它不是一个新的对象,它会在处理一个只是命令的引用指针的对象时引起任何问题吗?
非常感谢
我正在尝试使用 ASP.NET API 构建一个容易受到 SQL 注入攻击(用于教育目的)的网站。为此,我想FromSql
使用之前准备好的 SQL 查询进行调用,如下所示:
String query = "SELECT * FROM users WHERE email = '"+email
+"' AND password = '"+password+"'";
return RepositoryContext.Users.FromSql(query).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
但这段代码不会像FromSql
预期的那样编译FormattableString
,而不是 a String
。我收到以下错误消息:
错误 CS1503 参数 2:无法从“string”转换为“System.FormattableString”
下面的代码可以编译,但是此代码将不再容易受到 SQL 注入的攻击,因为实体框架将执行准备好的 SQL 查询并将电子邮件和密码转换为 SQL 查询参数:
return RepositoryContext.Users.FromSql(
$"SELECT * FROM users WHERE email = {email}
AND password = {password}").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
有没有办法将 a 转换String
为 a FormattableString
?
感谢您的帮助。
这在VB.Net中工作
Dim sSQL As String
sSQL = <sql>MySQLQueryHere</sql>.Value
Run Code Online (Sandbox Code Playgroud)
但是,这在C#中不起作用
string sSQL = "";
sSQL = <sql>MySQLQueryHere</sql>.Value;
Run Code Online (Sandbox Code Playgroud)
以下部分显示了构建后的错误。
Run Code Online (Sandbox Code Playgroud)sSQL = <sql>MySQLQueryHere</sql>.Value;
关于我在做什么错的任何建议吗?