ada*_*101 2 entity-framework entity-framework-6
如果创建的查询IQueryable<T>,则可以调用.ToString()以获取将要调用的SQL,但是该SQL可能包含@ p__linq__0,@ p__linq__1等参数。是否可以从中获取这些参数及其值的IQueryable<T>
以我的经验,它令人沮丧地复杂,但是这段代码将我带到了那里:
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>是由实体框架创建的对象。如果打算将其包装在实用程序方法中,则可能需要进行一些类型检查。