我想要编写两个Linq表达式的结果。我想要编写的结果将是两个返回对象的组合。
Expression<Func<Person, User>> basicUser = t => new User() { Name = t.FirstName };
Expression<Func<Person, User>> detailedUser = t => Execute basicUser and add the following assignments { DOB = t.DOB };
WHERE detailedUser继承了basicUser中的所有逻辑,并设置了User对象的DOB属性。
这样可以这样使用:
context.CreateObjectSet<Persons>().Where(p => p.PersonType == User).Select<Person, User>(detailedUser);
非常感谢任何帮助。
答案 0 :(得分:1)
您必须重建表达式才能添加字段。
假设这些表达式不复杂且basicUser
表达式将始终采用该形式,您只需更改表达式即可添加新绑定。你可以在一个简单的访客的帮助下做到这一点。
public class AddDobBindingVisitor : ExpressionVisitor
{
private ParameterExpression parameter;
protected override Expression VisitLambda<T>(Expression<T> node)
{
parameter = node.Parameters.Single();
return base.VisitLambda(node);
}
protected override Expression VisitMemberInit(MemberInitExpression node)
{
var member = typeof(User).GetProperty("DOB");
var newBindings = new[]
{
Expression.Bind(member, Expression.Property(parameter, "DOB")),
};
var updatedNode = node.Update(
node.NewExpression,
node.Bindings.Concat(newBindings));
return base.VisitMemberInit(updatedNode);
}
}
然后应用更改:
Expression<Func<Person, User>> basicUser = person => new User()
{
Name = person.FirstName
};
var detailedUser = (Expression<Func<Person, User>>)new AddDobBindingVisitor()
.Visit(basicUser);
// detailedUser:
// person => new User()
// {
// Name = person.FirstName,
// DOB = person.DOB
// }