单步执行表达式树(检查参数值等)

时间:2014-08-20 02:28:52

标签: c# .net linq lambda expression

我正在寻找一种方法来检查.Net表达式树中的参数值(以及可能的变量等)。

如果我的lambda(非表达式)中有一个块,即:

,我可以这样做
// Define string list
List<string> strs = new List<string>(new[] { "one", "two", "three" });

// Filter strings
string[] filtered = strs.Where(s => {
    return s.Length == 5 ||  s.StartsWith("o"); // Can set a breakpoint here
}).ToArray();

但是,当我使用与SQL问题兼容的表达式(即Linq to SQL或Linq to Entities强制执行非块语句)时,我无法做到这一点:

MyContext ctx = new MyContext();

// Filter strings
IQueryable<project> projects = ctx.projects.Where(p => 
    p.Name.Length == 5 ||  p.Name.StartsWith("o"); // CANNOT set a breakpoint here
).ToArray();

为什么我要问这个?

我遇到了一个N​​ull引用异常,它在我的表达式树中发生了几个层次,并且鉴于我无法破坏语句,我无法检查参数的值。

1 个答案:

答案 0 :(得分:0)

在使用之前,您可以在调试器中查看Expression的值。 我不安静看看示例代码是一个表达式。看起来更像直Linq和lambdas。

无论如何..您可以在调试器中看到Expression树。

   public virtual TPoco Get(Expression<Func<TPoco, bool>> predicate) {
        try {
            var resultEntity = AllQ().FirstOrDefault(predicate);  //<<<<< Breakpoint, predicate can be viewed
            return resultEntity;
        }
        catch (Exception ex) {
            // your error handling             
            return null;
        }
    }


    // call with 
    var rep = new Rep<Table>();
    var row = rep.Get(t=>t.StartsWith("o" );

了解Linq对实体的Linq限制          Supported Linq methods in EF