我有一些关于如何从我的数据库访问数据的建议:
var allMyIds
= context.Database.ExecuteSqlCommand("select id from AspNetUserLogins");
var allMyIds
= context.Database.SqlQuery<string>("select id from AspNetUserLogins");
有人可以解释这些之间的区别吗?
答案 0 :(得分:39)
SqlQuery
方法允许您从数据库中返回实体。其中ExecuteSqlCommand
只运行命令并从DB返回状态代码。
SqlQuery
(强调我的)
创建一个原始SQL查询,该查询将返回给定类型的元素。类型可以是具有与查询返回的列的名称匹配的属性的任何类型,也可以是简单的基本类型。该类型不必是实体类型。即使返回的对象类型是实体类型,上下文也不会跟踪此查询的结果。 使用SqlQuery方法返回由上下文跟踪的实体。与任何接受SQL的API一样,重要的是参数化任何用户输入以防止SQL注入攻击。您可以在SQL查询字符串中包含参数占位符,然后提供参数值作为附加参数。您提供的任何参数值将自动转换为DbParameter。 context.Database.SqlQuery(typeof(Post),“SELECT * FROM dbo.Posts WHERE Author = @ p0”,userSuppliedAuthor);或者,您也可以构造一个DbParameter并将其提供给SqlQuery。这允许您在SQL查询字符串中使用命名参数。 context.Database.SqlQuery(typeof(Post),“SELECT * FROM dbo.Posts WHERE Author = @author”,new SqlParameter(“@ author”,userSuppliedAuthor));
ExecuteSqlCommand
返回类型:int
对数据库执行给定的DDL / DML命令。与任何接受SQL的API一样,重要的是参数化任何用户输入以防止SQL注入攻击。您可以在SQL查询字符串中包含参数占位符,然后提供参数值作为附加参数。您提供的任何参数值将自动转换为DbParameter。 context.Database.ExecuteSqlCommand(“UPDATE dbo.Posts SET Rating = 5 WHERE Author = @ p0”,userSuppliedAuthor);或者,您也可以构造一个DbParameter并将其提供给SqlQuery。这允许您在SQL查询字符串中使用命名参数。 context.Database.ExecuteSqlCommand(“UPDATE dbo.Posts SET Rating = 5 WHERE Author = @author”,new SqlParameter(“@ author”,userSuppliedAuthor));