2013-11-26 143 views
0

不知道这是否可以使用Breeze,但我们有一种情况,我们需要从2个不同的来源返回IQueryableBreeze扩展错误

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

否则,将创建一个包含默认数据的List<T>,并将其转换为IQueryable,然后返回。

在客户端,我们的查询包含.expand以确保导航属性填充了所需的数据。当IQueryable从EF来创建List<T>

这工作得很好,但崩溃,并显示以下错误:

{"$id":"1","$type":"System.Web.Http.HttpError, System.Web.Http","Message":"An error has occurred.","ExceptionMessage":"'System.Linq.EnumerableQuery<MyObject>' does not contain a definition for 'Include'","ExceptionType":"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException","StackTrace":" at CallSite.Target(Closure , CallSite , Object , String)\r\n at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)\r\n at Breeze.WebApi.QueryHelper.<>c__DisplayClass14.<ApplyExpand>b__11(String expand)\r\n at System.Collections.Generic.List`1.ForEach(Action`1 action)\r\n at Breeze.WebApi.QueryHelper.ApplyExpand(IQueryable queryable, String expandsQueryString)\r\n at Breeze.WebApi.QueryHelper.ApplySelectAndExpand(IQueryable queryable, NameValueCollection map)\r\n at Breeze.WebApi.BreezeQueryableAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)\r\n at System.Web.Http.Filters.ActionFilterAttribute.CallOnActionExecuted(HttpActionContext actionContext, HttpResponseMessage response, Exception exception)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<>c__DisplayClass2.<System.Web.Http.Filters.IActionFilter.ExecuteActionFilterAsync>b__0(HttpResponseMessage response)\r\n at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass41`2.<Then>b__40(Task`1 t)\r\n at System.Threading.Tasks.TaskHelpersExtensions.ThenImpl[TTask,TOuterResult](TTask task, Func`2 continuation, CancellationToken cancellationToken, Boolean runSynchronously)"} 

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

+0

服务器端方法是什么样的? –

+0

一切都推迟到我们的业务逻辑层,但控制器看起来像:[HttpGet] public IQueryable Customers(string id){ return logic.Get(id); }' – llihp

回答

0

我认为在这种情况下,您最好的选择是从客户端删除“扩展”并将其移动到服务器(作为Include)。类似这样的:

[HttpGet] 
public IQueryable<Customer> Customers(someCriteria) { 
    if (... haveData ...) { 
     return ContextProvider.Context.Customers.Include("Orders"); 
    } else { 
     return DefaultCustomerList.AsQueryable() 
    } 
} 
+0

我认为这可能是这种情况,但只是想知道我是否错过了明显的东西。明天再试吧。 – llihp

+0

将展开到服务器解决了我眼前的问题。使用WebApi2版本的Breeze进行了一些测试,并且使用该版本的客户端似乎可以正常工作,但目前我们无法升级到该版本。 – llihp