Breeze 微风膨胀误差

Breeze 微风膨胀误差,breeze,Breeze,不确定使用Breeze是否可以实现这一点,但我们需要从两个不同的来源返回IQueryable 从控制器操作调用的业务逻辑检查某些数据是否存储在数据库中,如果是,则从使用EFContextProvider的存储库返回IQueryable 否则,将创建一个包含默认数据的列表,并将其转换为IQueryable,然后返回该列表 在客户端,我们的查询包含.expand以确保导航属性填充了所需的数据 当IQueryable来自EF时,这可以正常工作,但在创建列表时会因以下错误而崩溃: {“$id”:“1”,

不确定使用Breeze是否可以实现这一点,但我们需要从两个不同的来源返回
IQueryable

从控制器操作调用的业务逻辑检查某些数据是否存储在数据库中,如果是,则从使用
EFContextProvider
的存储库返回
IQueryable

否则,将创建一个包含默认数据的
列表
,并将其转换为
IQueryable
,然后返回该列表

在客户端,我们的查询包含.expand以确保导航属性填充了所需的数据

IQueryable
来自EF时,这可以正常工作,但在创建
列表时会因以下错误而崩溃:

{“$id”:“1”,“$type”:“System.Web.Http.HttpError,System.Web.Http”,“Message”:“发生错误”,“ExceptionMessage”:“System.Linq.EnumerableQuery”不包含“Include”的定义,“ExceptionType”:“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”,“StackTrace”:“位于CallSite.Target(闭包、调用站点、对象、字符串)\r\n在System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site,T0 arg0,T1 arg1)\r\n在Breeze.WebApi.QueryHelper.c\u DisplayClass14.b\u 11(字符串展开)\r\n在System.Collections.Generic.List`1.ForEach(Action`1 Action)\r\n在Breeze.WebApi.QueryHelper.ApplyExpand(可检索的可查询字符串,字符串可展开)\r\n位于Breeze.WebApi.QueryHelper.ApplySelectAndExpand(IQueryable queryable,NameValueCollection map)\r\n位于Breeze.WebApi.BreezeQueryableAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)\r\n位于System.Web.Http.Filters.ActionFilterAttribute.CallOnActionExecuted(HttpActionContext actionContext,HttpResponseMessage response,Exception Exception)\r\n位于System.Web.Http.Filters.ActionFilterAttribute.c_uuDisplayClass2.b_u0(HttpResponseMessage response)\r\n位于System.Threading.Tasks.TaskHelperExtensions.c_uDisplayClass41`2.b_u40(Task`1 t)\r\n位于System.Threading.TaskHelperExtensions.TheImpl[TTask,TOuterResult](TTask任务,Func`2 continuation,CancellationToken CancellationToken,Boolean runSynchronously)}

这是Breeze的一个问题(我们目前使用的是1.4.2),还是我做错了什么?

我认为在这种情况下,最好的办法是从客户端删除“扩展”并将其移动到服务器上(作为一个包含项)。类似这样:

[HttpGet]
public IQueryable<Customer> Customers(someCriteria) {
  if (... haveData ...) {
      return ContextProvider.Context.Customers.Include("Orders");
  } else {
      return DefaultCustomerList.AsQueryable()
  }
}
[HttpGet]
公共IQueryable客户(someCriteria){
如果(…有数据…){
返回ContextProvider.Context.Customers.Include(“订单”);
}否则{
返回DefaultCustomerList.AsQueryable()
}
}

服务器端方法是什么样子的?一切都推迟到我们的业务逻辑层,但控制器看起来是:
[HttpGet]public IQueryable Customers(string id){return logic.Get(id);}
我认为可能是这样,但只是想知道我是否遗漏了一些明显的东西。我明天会尝试一下。将扩展移到服务器解决了我的直接问题。对Breeze的WebApi2版本进行了一些测试,使用该版本的客户端似乎工作正常,但我们目前无法升级到该版本。
[HttpGet]
public IQueryable<Customer> Customers(someCriteria) {
  if (... haveData ...) {
      return ContextProvider.Context.Customers.Include("Orders");
  } else {
      return DefaultCustomerList.AsQueryable()
  }
}