在这个问题之后,我想知道是否应该将 lambda 参数表达式实例的重用视为好还是坏?
我有时会得到一个完整的 LINQ 表达式树,其中相同的 lambda 参数实例在第二个非嵌套 lambda 中正确使用是本地的:
// class Person { public int AProp { get; set; } public bool BProp { get; set; }}
var lparam = Expression.Parameter(typeof(Person),"x");
var lambda1 = (Expression<Func<Person,int>>)Expression.Lambda(Expression.Property(lparam, "AProp"), lparam);
var lambda2 = (Expression<Func<Person,bool>>)Expression.Lambda(Expression.Property(lparam, "BProp"), lparam);
var source = (new Person[0]).AsQueryable();
var query = source.Where(lambda2).OrderBy(lambda1);
所以相同的 lambda 参数实例 lparam 的声明对于 lambda1 和 lambda2 都是正确的。
只是这个共享的 lambda 参数实例强制 IQueryProvider 实现不关联基于纯 lambda 参数引用的其他全局含义,因为在处理不同的 lambda 期间可能需要以不同的方式解释相同的参数。此外,您不会通过使用从 LINQ 获得这种表达式树(或者我应该说图形?)
Expression<Func<Person,int>> lambda3 = x => x.AProp;
Expression<Func<Person,bool>> lambda4 = x => x.BProp;
因为对于两个 lambda 表达式都会有不同的 (Person x) 参数实例。这同样适用于
var query = source.Where(x => x.BProp).OrderBy(x => x.AProp);
或者
var query = from x in source where x.BProp order by x.AProp select x;
它还使表达式树更像是一个图形。
这种重用参数实例的方式被认为是好还是坏?到目前为止,我还没有从当局那里找到明确的答案。