使用$ expand的OData由于包装而中断了转换操作

时间:2014-01-07 18:57:32

标签: c# asp.net-web-api odata

我遇到的问题与解决here:

相同

然而,答案对我来说还不够。首先,我不能在我的生活中找到OData 5.0.0中的HierarchyNodeExpressionVisitor(不是RC1)(或者就此而言,尝试使用Google搜索)。

第二,即使我确实发现它返回IHttpActionResult还不够好,我需要返回一个键入的PageResult<MyViewModel>

返回IHttpActionResult的陈述理由是“处理结果可能不再是IQueryable<MyEntity>的事实。”一旦使用$ expand运算符。

但这对我没有意义,因为我认为$ expand运算符用于在实体上包含导航属性,就像服务器端Include(e => e.RelatedProperty)那样。至少在我的情况下,我只包括已经在实体上的属性,所以我不必担心它“可能是其他东西”。

但是,在使用$expand=Department时,我无法Cast<>()实体类型,因为它无法将SelectAllAndExpand<MyEntity>投射到MyEntity

如何将展开“展开”回原始实体,以便我可以进行投影?

public PageResult<DateSnippetWithDepartmentsViewModel> GetDatesWithDepartments(ODataQueryOptions<DateSnippet> options)
{
    IQueryable query = options.ApplyTo(_context.DateSnippets, new ODataQuerySettings());;

    //Exception when using $expand.. cannot cast SelectAllAndExpand<DateSnippet> to DateSnippet
    List<DateSnippet> dateSnippets = query.Cast<DateSnippet>().ToList();

    var dateSnippetsViewModels = (from d in dateSnippets
                                    select new DateSnippetWithDepartmentsViewModel
                                    {
                                        ...
                                    });

    var result = new PageResult<DateSnippetWithDepartmentsViewModel>(
            dateSnippetsViewModels as IEnumerable<DateSnippetWithDepartmentsViewModel>,
            Request.GetNextPageLink(),
            Request.GetInlineCount());

    return result;
}

1 个答案:

答案 0 :(得分:1)

试试这个。希望在我们到达枚举器时应该工作,结果应该是DateSnippet。你以前在做什么试图在Linq Expression树中进行投射。我怀疑在IQueryable执行中,解决和转换而不是强制转换。

public PageResult<DateSnippetWithDepartmentsViewModel> GetDatesWithDepartments(ODataQueryOptions<DateSnippet> options)
{
    IQueryable query = options.ApplyTo(_context.DateSnippets, new ODataQuerySettings());;

    List<DateSnippet> dateSnippets = new List<DateSnippet>();
    foreach(DateSnippet item in query)
    {
        dateSnippets.Add(item);
    }

    var dateSnippetsViewModels = (from d in dateSnippets
                                    select new DateSnippetWithDepartmentsViewModel
                                    {
                                        ...
                                    });

    var result = new PageResult<DateSnippetWithDepartmentsViewModel>(
            dateSnippetsViewModels as IEnumerable<DateSnippetWithDepartmentsViewModel>,
            Request.GetNextPageLink(),
            Request.GetInlineCount());

    return result;
}