下列的这个问题我想知道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);
or
var query = from x in source where x.BProp order by x.AProp select x;
它还使表达式树更像是一个图。
这种重用参数实例的方式被认为是好还是坏?到目前为止,我还没有从官方那里得到明确的答复。