.net Entity中想执行sql语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net Entity中想执行sql语句相关的知识,希望对你有一定的参考价值。

.net Entity中想执行sql语句,但是不知道如何获取返回值。。。删除用ExecuteStoreCommand是知道的~求解答~在线等~不要Entity to Linq的写法那个我会~

参考技术A /// <summary>
/// 测试在 Entity Framework 中, 直接执行 SQL 语句.
/// </summary>
class TestExecSql


/// <summary>
/// 用于 动态执行的 SQL 语句.
/// </summary>
private const string testSql = @"select
s.id as id,
m.value as main_value,
s.value as sub_value
from
test_main m
join test_sub s
on (m.id = s.main_id) ";

/// <summary>
/// 测试.
/// </summary>
public static void DoTest()


Console.WriteLine("测试 直接执行 SQL 语句!");
using (TestEntities context = new TestEntities())
// 通过下面这种方式, 执行一个 SQL 语句.
// 要求 SQL 查询返回的结果形式, 要是一个 Entity类。
// 这里的做法是, 根据查询的结果字段, 去数据库建一个空的表,然后导入到 EntityFramework 的 edmx 文件中.
var query =
context.ExecuteStoreQuery<QUERY_RESULT_MAIN_AND_SUB>(testSql);

foreach (QUERY_RESULT_MAIN_AND_SUB result in query)

Console.WriteLine(
"直接执行 SQL 语句结果:MainVal = 0, SubVal = 1 ",
result.MAIN_VALUE,
result.SUB_VALUE );



Console.WriteLine("测试 直接执行 SQL 语句 结束!");
Console.WriteLine();


追问

using (TestEntities context = new TestEntities())
这个是哪个服务?需要添加什么引用?还有我这里是做后台逻辑数据的~这个。。。目测不适用啊。。。

DbCommandInterceptor抓取EF执行时的SQL语句

 

EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我们更加方便的了解到EF运行时的一些信息,当然我们最想看的还是EF生成的Sql语句,话不多讲,开始干吧;

public class EFIntercepterLogging : DbCommandInterceptor
    {

        ILog log = LogManager.GetLogger("InfoAppender");
        private readonly Stopwatch _stopwatch = new Stopwatch();
        public override void ScalarExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {
            SaveCmdSql(command);
            base.ScalarExecuting(command, interceptionContext);
            _stopwatch.Restart();
        }
        public override void ScalarExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {
            _stopwatch.Stop();
            SaveCmdSql(command);
            if (interceptionContext.Exception != null)
            {
                Trace.TraceError("Exception:{1} rn --> Error executing command: {0}", command.CommandText, interceptionContext.Exception.ToString());
            }
            else
            {
                Trace.TraceInformation("rn执行时间:{0} 毫秒rn-->ScalarExecuted.Command:{1}rn", _stopwatch.ElapsedMilliseconds, command.CommandText);
            }
            base.ScalarExecuted(command, interceptionContext);
        }
        public override void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
            SaveCmdSql(command);
            base.NonQueryExecuting(command, interceptionContext);
            _stopwatch.Restart();
        }
        public override void NonQueryExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
            _stopwatch.Stop();
            SaveCmdSql(command);
            if (interceptionContext.Exception != null)
            {
                Trace.TraceError("Exception:{1} rn --> Error executing command:rn {0}", command.CommandText, interceptionContext.Exception.ToString());
            }
            else
            {
                Trace.TraceInformation("rn执行时间:{0} 毫秒rn-->NonQueryExecuted.Command:rn{1}", _stopwatch.ElapsedMilliseconds, command.CommandText);
            }
            base.NonQueryExecuted(command, interceptionContext);
        }
        /// <summary>
        /// 读取操作
        /// </summary>
        /// <param name="command"></param>
        /// <param name="interceptionContext"></param>
        public override void ReaderExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
        {
            SaveCmdSql(command);
            base.ReaderExecuting(command, interceptionContext);
            _stopwatch.Restart();
        }
        public override void ReaderExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
        {
            _stopwatch.Stop();
            SaveCmdSql(command);
            if (interceptionContext.Exception != null)
            {
                Trace.TraceError("Exception:{1} rn --> Error executing command:rn {0}", command.CommandText, interceptionContext.Exception.ToString());
            }
            else
            {
                Trace.TraceInformation("rn执行时间:{0} 毫秒 rn -->ReaderExecuted.Command:rn{1}", _stopwatch.ElapsedMilliseconds, command.CommandText);
            }
            base.ReaderExecuted(command, interceptionContext);
        }
        //保存执行的sql语句
        public void SaveCmdSql(DbCommand command)
        {
            log.Info(command.CommandText);
        }

    }

最后在Global.asax中注册下这个。

就可以记录sql语句了。

//EF监控
DbInterception.Add(new EFIntercepterLogging());

转自:https://www.cnblogs.com/lgxlsm/p/6305816.html

以上是关于.net Entity中想执行sql语句的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句

Entity Framework——执行sql语句

如何获取Entity Framework在执行savechanges()前或执行后所生成的SQL语句

请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?

Entity Framework 的 FromSql 方法执行使用内部连接选择语句的 SQL Server 表值函数

《Entity Framework 6 Recipes》中文翻译系列 (12) -----第三章 查询之使用SQL语句 (转)