2013-11-26 142 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