我遇到的问题与解决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;
}
答案 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;
}