ExecuteSqlCommand和SqlQuery有什么区别?什么时候进行数据库访问?

Sam*_*tar 23 c# asp.net entity-framework sql-server-2012 entity-framework-6

我有几个关于如何从我的数据库访问数据的建议:

var allMyIds
    = context.Database.ExecuteSqlCommand("select id from AspNetUserLogins");

var allMyIds
    = context.Database.SqlQuery<string>("select id from AspNetUserLogins");
Run Code Online (Sandbox Code Playgroud)

如果有人可以解释这些之间的区别吗?

The*_*Wes 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));