我有一个带有Microsoft.Data.Odata 5.6,Breeze.WebApi2 1.5和EF6的Web API 2项目。
使用$select
和$expand
语法,Breeze可以很好地通过导航属性获取查询的详细信息。
我一直在与之斗争的一个问题是,一旦odata查询得到有效解决,如何将一些外部数据包含在生成的实体中。
到目前为止,我的方法包括扩展BreezeQueryableAtribute并尝试捎带结果,以便我可以在将其发送到客户端之前注入我的ad-hoc数据。
有一个过程有点类似于BreezeQueryable属性本身后面的过程
https://github.com/Breeze/breeze.server.net/blob/master/Breeze.WebApi2/BreezeQueryableAttribute.cs
但是,我无法解析响应的结果。这似乎是作为无法回送到IQuerable的匿名Breeze.ContextProvider.DynamicTypeBase返回的,例如
public class CustomBreezeQueryable :BreezeQueryableAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
var response = actionExecutedContext.Response;
//some validation code removed for clarity
base.OnActionExecuted(actionExecutedContext);
if (!response.TryGetContentValue(out responseObject))
{
return;
}
var queryResult = responseObject as IQueryable<MyEntityType>;
//queryResult is null!
//apply transforms to resulting entities
//var dtos = ....
actionExecutedContext.Response = actionExecutedContext.Request
.CreateResponse(HttpStatusCode.OK, dtos.AsQueryable());
}}
有趣的是,我实际上可以通过VS&#34; locals&#34;来检查查询的结果。窗口并浏览结果集的内部属性。 因此,就Breeze而言,一切都按预期工作,但我还没有找到一种简单的方法来扩展所产生的结果。
我的猜测是,这个内部Breeze调用queryHelper.WrapResult(request, response, queryResult);
产生的包装和格式化是阻止我使用IQueryable的原因。
关于如何将此Breeze.ContextProvider.DynamicTypebase解析回我的标准实体的任何想法? 或者可能采用完全不同的方法?
谢谢,
乌梅