如何获取实体框架查询的参数?

ada*_*101 2 entity-framework entity-framework-6

如果创建的查询IQueryable<T>,则可以调用.ToString()以获取将要调用的SQL,但是该SQL可能包含@ p__linq__0,@ p__linq__1等参数。是否可以从中获取这些参数及其值的IQueryable<T>

esm*_*e68 7

以我的经验,它令人沮丧地复杂,但是这段代码将我带到了那里:

        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()}");
        }
Run Code Online (Sandbox Code Playgroud)

请注意,此代码仅适用于IQueryable<T>实际上DbQuery<T>是由实体框架创建的对象。如果打算将其包装在实用程序方法中,则可能需要进行一些类型检查。

  • 我想我现在明白了。我必须首先在我的查询中调用 ToString。一旦被调用,它必须只解析/填充内容。 (2认同)