我该如何获取Entity Framework查询的参数?

6
如果我创建了一个 IQueryable<T> 的查询,我可以调用 .ToString() 来获取将要调用的 SQL 语句,但该 SQL 语句可能包含参数,如 @p__linq__0、@p__linq__1 等等。是否有一种方式可以从 IQueryable<T> 获取这些参数及其值?
1个回答

15

根据我的经验,这可能会令人沮丧地复杂,但是这段代码帮助我完成了任务:

        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()}");
        }

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


这似乎只有在我缓慢地逐步执行代码时才有效。否则,Parameters属性为空。有什么方法可以保证参数被填充吗? - adam0101
2
我现在明白了。我必须先在查询上调用ToString。它只有在调用时才能解析/填充内容。 - adam0101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接