How can I get the parameters of an Entity Framework query?

后端 未结 1 1130
清歌不尽
清歌不尽 2020-12-19 19:14

If I create a query of IQueryable, I can call .ToString() to get the SQL that will be called, but that SQL may contain parameters like @p__linq__0, @p_

相关标签:
1条回答
  • 2020-12-19 19:56

    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(); // this will populate the parameters collection
            foreach (var objectParam in objectQuery.Parameters)
            {
                Console.WriteLine($"{objectParam.Name} = {objectParam.Value.ToString()}");
            }
    

    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.

    0 讨论(0)
提交回复
热议问题