如何获取Entity Framework查询的参数? [英] How can I get the parameters of an Entity Framework query?

查看:207
本文介绍了如何获取Entity Framework查询的参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我创建一个 IQueryable 的查询,我可以调用.ToString()来获取将被调用的SQL,但该SQL可能包含诸如@ p__linq__0,@ p__linq__1等有没有办法从 IQueryable< T> 中获取这些参数及其值

If I create a query of IQueryable<T>, I can call .ToString() to get the SQL that will be called, but that SQL may contain parameters like @p__linq__0, @p__linq__1, etc. Is there a way to get those parameters and their values from the IQueryable<T>

推荐答案

根据我的经验,令人沮丧的是复杂的,但这段代码让我在那里:

It's frustratingly complicated, in my experience, but this code got me there:

        var dbQuery = (DbQuery<T>)query;
        // get the IInternalQuery internal variable from the DbQuery object
        var iqProp = dbQuery.GetType().GetProperty("InternalQuery", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        var iq = iqProp.GetValue(dbQuery, null);
        // get the ObjectQuery internal variable from the IInternalQuery object
        var oqProp = iq.GetType().GetProperty("ObjectQuery", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        var objectQuery = (ObjectQuery<T>)oqProp.GetValue(iq, null);

        var sqlString = objectQuery.ToTraceString();
        foreach (var objectParam in objectQuery.Parameters)
        {
            Console.WriteLine($"{objectParam.Name} = {objectParam.Value.ToString()}");
        }

请注意,此代码仅适用于 IQueryable&T ; 实体 DbQuery< T> 的对象,由实体框架创建。如果您打算将其包装在实用程序中,则可能会有一些类型检查。

Note that this code only works for IQueryable<T> objects that are actually DbQuery<T>, as are created by entity framework. If you intend to wrap this in a utility method, some type checking may be in order.

这篇关于如何获取Entity Framework查询的参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆