2

我正在尝试使用 ODataQueryOptions 通过自定义 DAL 实现一些 OData 功能。

我的 DAL 使用设计时生成的类型化数据表。通过拦截 ODataQueryOptions 的 SelectExpand 属性,我可以让我们的 DAL 仅加载所需的列。

然后我如何只返回所需的数据。

我目前正在将类型数据表中的数据倾倒到 ListOf 一些类型化数据传输对象中,但最终会从不需要的列中得到大量空数据。

我觉得我应该能够做一些 LINQ 查询来直接从类型化数据表中选择我需要的列,完全绕过使用类型化 DTO。这可能吗?

4

1 回答 1

3

您需要执行与SelectExpandQueryOption.ApplyTo相同的操作。

1)优化查询到后端。与其从数据库中获取整个实体,不如仅获取客户端要求的属性并将其包装成一个 IEdmEntityObject。将集合作为 EdmEntityObjectCollection 返回。此步骤是可选的。您可以选择忽略此步骤并返回 IQueryable 并仍然让 $select 工作。

2) 告诉 OData 格式化程序仅序列化请求的字段。这可以通过使用扩展方法在 Request 对象上填充 SelectExpandClause 来完成Request.SetSelectExpandClause

public class CustomersController : ODataController
{
    public IEnumerable<Customer> Get(ODataQueryOptions<Customer> query)
    {
        Customer[] customers = new[] { new Customer { ID = 42, Name = "Raghu" } };

        // Apply query
        var result = customers;

        // set the SelectExpandClause on the request to hint the odata formatter to 
        // select/expand only the fields mentioned in the SelectExpandClause.
        if (query.SelectExpand != null)
        {
            Request.SetSelectExpandClause(query.SelectExpand.SelectExpandClause);
        }

        return result;
    }
}
于 2013-09-04T00:19:34.787 回答