Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转置或翻译表达式Linq_Linq - Fatal编程技术网

转置或翻译表达式Linq

转置或翻译表达式Linq,linq,Linq,我有viewmodel(比如memberviewmodel)和ef模型(比如member)。我如何翻译 > GetByProperty(Expression<Func<MemberViewModel, bool>> whereCondition) >GetByProperty(表达式whereCondition) 到 >GetByProperty(表达式whereCondition) 有什么想法吗 My service公开了方法GetByProperty(Ex

我有viewmodel(比如memberviewmodel)和ef模型(比如member)。我如何翻译

> GetByProperty(Expression<Func<MemberViewModel, bool>> whereCondition)
>GetByProperty(表达式whereCondition)

>GetByProperty(表达式whereCondition)
有什么想法吗


My service公开了方法GetByProperty(Expression>whereCondition),但在服务中,它调用了公开方法GetByProperty(Expression>whereCondition)的业务对象。

要将
Expression
转换为
Expression
,您需要扩展该类。我假设
MemberViewModel
只包含字段和属性<代码>成员当然需要实现相同的字段和属性集。在这种情况下,应采取以下措施:

public class ParameterModifier<TSrc, TDest> : ExpressionVisitor
{
    ParameterExpression parameter;

    public ParameterModifier()
    {
        parameter = Expression.Parameter(typeof(TDest), "member");
    }

    protected override Expression VisitParameter(ParameterExpression node)
    {
        if (node.Type == typeof(TSrc))
        {
            return parameter;
        }
        else
            return base.VisitParameter(node);
    }

    protected override Expression VisitMember(MemberExpression node)
    {
        if (node.Expression.Type == typeof(TSrc))
        {
            return Expression.PropertyOrField(Visit(node.Expression), node.Member.Name);
        }
        else
        {
            return base.VisitMember(node);
        }
    }

    protected override Expression VisitLambda<T>(Expression<T> node)
    {
        if (node.Parameters.Any(p => p.Type == typeof(TSrc)))
        {
            return Expression.Lambda(Visit(node.Body), node.Parameters.Select(p => p.Type == typeof(TSrc) ? parameter : p));
        }
        else
        {
            return base.VisitLambda<T>(node);
        }
    }
}
公共类参数修改器:ExpressionVisitor
{
参数表达式参数;
公共参数修改器()
{
参数=表达式。参数(类型(TDest),“成员”);
}
受保护的重写表达式VisitParameter(ParameterExpression节点)
{
if(node.Type==typeof(TSrc))
{
返回参数;
}
其他的
返回基本访问参数(节点);
}
受保护的重写表达式VisitMember(MemberExpression节点)
{
if(node.Expression.Type==typeof(TSrc))
{
返回Expression.PropertyOrField(访问(node.Expression)、node.Member.Name);
}
其他的
{
返回base.VisitMember(节点);
}
}
受保护的重写表达式VisitLambda(表达式节点)
{
if(node.Parameters.Any(p=>p.Type==typeof(TSrc)))
{
返回表达式.Lambda(访问(node.Body),node.Parameters.Select(p=>p.Type==typeof(TSrc)?参数:p));
}
其他的
{
返回base.VisitLambda(节点);
}
}
}
在将谓词传递给第二个方法之前,现在可以使用上面的类对其进行转换:

IEnumerable<MemberViewModel> GetByProperty(Expression<Func<MemberViewModel, bool>> whereCondition)
{
    var converter = new ParameterModifier<MemberViewModel, Member>();
    var convertedExpression = converter.Visit(original) as Expression<Func<Member, bool>>;
    IEnumerable<Member> members = GetByProperty(convertedExpression);
    return members.Select(new MemberViewModel(member));
}
IEnumerable GetByProperty(表达式whereCondition)
{
var converter=新参数修改器();
var convertedExpression=converter.Visit(原始)作为表达式;
IEnumerable members=GetByProperty(convertedExpression);
返回成员。选择(新建成员视图模型(成员));
}

翻译是什么意思?是否要调用getsingle?如何在这两个方法之间进行通信?不能使用whereCondition将其传递到第二个方法中,可以吗?
IEnumerable<MemberViewModel> GetByProperty(Expression<Func<MemberViewModel, bool>> whereCondition)
{
    var converter = new ParameterModifier<MemberViewModel, Member>();
    var convertedExpression = converter.Visit(original) as Expression<Func<Member, bool>>;
    IEnumerable<Member> members = GetByProperty(convertedExpression);
    return members.Select(new MemberViewModel(member));
}