我正在寻找一种方法来检查.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();
我遇到了一个Null引用异常,它在我的表达式树中发生了几个层次,并且鉴于我无法破坏语句,我无法检查参数的值。
答案 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