2017-05-15 8 views
3

(C#을 LINQ) 이것을 하나로, OData는 모든 직원로드 요청을 GET입니다 : 내가 가진수정 MethodCallExpression 인수가 GET 요청</p> <p>에 대한 실행되기 전에 나는 <code>MethodCallExpression</code> 인수를 추가 할 필요가

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 대신에 무엇을해야합니까 : 다음 코드를 시도?

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

    return nHibernateQueryProvider.Execute(query.Expression); 
} 

을하지만 할 아마 더 좋은 방법이 있습니다

답변

2

당신의 QueryProviderhere의 하나입니다 추측, 그리고 그 하드 코딩 질문에서와 같이 쿼리 개체를 당신을 위해 적합합니다, 그것은 간단해야 그 툴킷은 표현을 작성하기위한 것입니다. 위와 같이 하드 캐스트를하면 코드 냄새가 난다.