我需要在MethodCallExpression上添加参数,然后再为GET请求执行该参数

这是加载所有员工的OData GET请求:

server/employees?$filter=birthday+ge+datetime'1985-01-01'


我尝试了以下代码:

// My class inherits from IQToolkit which is building an expression based on the request
public class MyQueryProvider : QueryProvider
{
    // Is defined in advance (after a client established a connection)
    private int clientDepartmentNo;

    // This is the central function, which gets a MethodCallExpression from the toolkit
    // and executes it
    public override object Execute(MethodCallExpression expression)
    {
        // The current content of expression (see my OData URL above):
        // "value(NHibernate.Linq.NhQueryable`1[Models.Employee]).Where(it => (it.Birthday >= Convert(01.01.1985 00:00:00)))"

        // Now I would like to extend the expression like that:
        // "value(NHibernate.Linq.NhQueryable`1[Models.Employee]).Where(it => (it.Birthday >= Convert(01.01.1985 00:00:00)) && it.DepartmentNo == clientDepartmentNo)"

        // That works fine
        var additionalExpressionArgument = (Expression<Func<Employee, bool>>)(x => x.DepartmentNo == clientDepartmentNo);


        // But that is still not possible, because the property .Arguments is readonly...
        expression.Arguments.Add(additionalExpressionArgument);
        // Can you give me an advice for a working solution?


        // Would like to execute the query based on the URL and extension
        return nHibernateQueryProvider.Execute(expression);
    }
}


我应该怎么代替上面的expression.Arguments.Add

最佳答案

猜测您的QueryProviderhere中的一个,并且按照您的问题对所查询的实体进行硬编码适合您,它应该很简单:

public override object Execute(MethodCallExpression expression)
{
    var query = (Query<Employee>)(CreateQuery<Employee>(expression)
        .Where(x => x.DepartmentNo == clientDepartmentNo));

    return nHibernateQueryProvider.Execute(query.Expression);
}


但是可能有更好的方法来执行此操作,因为该工具包用于构建表达。正如我在上面所做的那样,必须强制转换看起来像是一种代码气味。

关于linq - 修改MethodCallExpression参数(C#LINQ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43978737/

10-11 02:15
查看更多