将IQueryable where子句从DTO映射到实体

Dan*_*ger 5 c# linq automapper odata

我有一个OData WebAPI方法,如下所示:

        // GET: odata/Employees
    [EnableQuery]
    public IQueryable<DTOs.Employee> GetEmployees()
    {
        return this.AttemptOperation(context => 
            {
                IQueryable<DTOs.Employee> employees
                    = context.Employees.Project().To<DTOs.Employee>();
                return employees;
            });
    }
Run Code Online (Sandbox Code Playgroud)

如果我不指定过滤器,它将数据返回给服务。但是,一旦我在URL中添加$ filter = EmployeeID eq'1',我就会得到一个例外。

例外是来自我用于对DynamoDB执行LINQ查询的AWS DynamoDB上下文库。但是,这表明上下文没有用于DTOs.Employee的表。

这当然是显而易见的,上下文是实体,而不是DTO。

我如何从客户端指定的IQueryable where子句转换回正确的实体类型?

例如,客户端需要针对DTOs.Employee.EmployeeID进行查询,并且需要将其转换为针对Entities.Employee.EmployeeID的where子句。

Lui*_*eia 0

简单的:

public IQueryable<DTOs.Employee> GetEmployees()
{
    return this.AttemptOperation(context => 
        {
            // I commented here your old code:
            // IQueryable<DTOs.Employee> employees = context.Employees.Project().To<DTOs.Employee>();

            // This is our new code:
            var employees = context.Employees.Project()

            return employees.select(m=> new EmployeeDto {
                property1 = m.property1,
                property2 = m.property2
            }
        });
}
Run Code Online (Sandbox Code Playgroud)

重要提示:您不能使用 EmployeeDto 构造函数。Linq 下禁止这样做。