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

标签 c# linq odata automapper

我有一个 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;
            });
    }

如果我没有指定过滤器,它会将数据返回给服务。 但是只要我将 $filter=EmployeeID eq '1' 添加到 URL,我就会得到一个异常。

异常来 self 用于对 DynamoDB 执行 LINQ 查询的 AWS DynamoDB 上下文库。但是,它表示上下文没有 DTOs.Employee 的表。

这当然很明显,上下文有实体,而不是 DTO。

我怎样才能让客户端指定的 IQueryable where 子句转换回正确的实体类型?

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

最佳答案

简单:

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
            }
        });
}

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

关于c# - 将 IQueryable where 子句从 DTO 映射到实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30249610/

相关文章:

c# - System.ObjectDisposedException : The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

c# - 如何比较两个属性组合的两个列表并选择第三个属性不匹配的行?

C# Lambda 返回一些空值

odata - 将空值传递给 OData V2 Edm.Time 属性

c# - 如何在数据表中进行加权求和?

c# - 如何将复杂的 linq 映射到对象

c# - 为什么在 Select 之前运行 LINQ OrderBy 会花费更多时间?

c# - 使用 ODataQueryOptions 时无法应用 $select

c# - OData WebApi V4 .net - 自定义序列化

c# - 选择年龄最接近数字的最高年龄