2013-09-25 136 views
4

我是BreezeJS的新手,想知道如何在SQL存儲過程中使用Breeze嗎?BreezeJS和存儲過程

我們有一些非常複雜的查詢,希望能夠通過SP調用它們。另外,我們如何告訴Breeze從SP返回的列是Key?我們不想使用視圖,因爲我們每次調用它時都需要將變量傳遞給SP查詢。

謝謝。

鮑勃

回答

3

好,其基本思想是使用微風的EntityQuery.withParameters方法將參數傳遞給調用您的存儲過程,並返回一個IEnumerable的服務器端方法。 (即存儲的proc的結果)。

如果您想將此結果作爲Breeze實體的集合對待,那麼您需要將結果整形爲Breeze從元數據知道的現有實體類型,或者在客戶端上手動創建並添加一個新的EntityType你想要返回的形狀。

你可能想看看EntityQuery.toType方法強制微風您返回的數據轉換爲特定的EntityType或者你可能要交替使用「jsonResultsAdapter」做同樣的事情。

,其從查詢返回的並且被轉換成一個微風的EntityType任何數據都根據「modelLibrary」在使用中,即敲除,角,骨幹自動換等

如果微風不能夠構建實體在返回的數據之外,它仍然會被返回,但是沒有任何特殊的處理來包裝結果。

希望這會有所幫助!

+0

這很有幫助。我想知道是否有任何代碼示例? –

+0

對不起,還沒有!但我們確實有很多成功使用過它們的人。 –

0

這裏不是一個真正的答案,只是一些想法。 我認爲通過使用withParameters通過使用存儲過程來返回任意形狀的數據(讀取視圖模型)的能力將是一個很好的方式來解決諸如dapper.net之類的問題。重新提交視圖模型後,您可以使用重載來重建視圖模型中的實際實體並保存更改。我遇到的唯一問題是,人們需要一種方法來輕鬆自動地重新運行sproc並將數據發送回客戶端... 如果這對其他人有意義並且/或者如果任何人有已經完成了。 對於這種場景,我認爲你需要禁用微風提供的功能和/或編寫一個足夠智能的數據服務,它可以處理視圖模型,以便客戶端上的javascript知道何時添加/刪除/更新您創建對象jx,jy,jz(j代表javascript)的視圖模型a的部件x,y,z,並將它們提交回並保存(與上面提到的方式相反) 想法?

1

從Breeze訪問Sql Stored Procedures的示例;商店程序(GoStoCde)已由EF導入。

微風控制器:

[HttpGet] 
public object GetCdes(long jprod, int jqte, long jorder) 
{ 
    //output params 
    var owrk = new System.Data.Objects.ObjectParameter("wkres", typeof(string)); 
    owrk.Value = ""; 
    var oeror = new System.Data.Objects.ObjectParameter("ceror", typeof(int)); 
    oeror.Value = 0; 
    //invoke stored procedure 
    var envocde = _contextProvider.Context.GoStoCde(jprod, jqte, jorder, owrk, oeror); 
    //stored procedure results 
    var cdeResult = new { 
    dwork = owrk.Value, 
    deror = oeror.Value, 
    }; 
    return new { cdeResult }; 
} 

的DataContext:

function reqLnecde(iprod, iqte, iorder, vxeror) { 
    logger.log("commande en cours..."); 
    var query = new EntityQuery.from("GetCdes") 
     .withParameters({ jprod: iprod, jqte: iqte, jorder: iorder }); 
     return manager 
      .executeQuery(query) 
       .then(querySucceeded) 
       .fail(cqueryFailed); 
     function querySucceeded(data) { 
       //stored procedure results 
     vxeror(data.results[0]); 
       //stored procedure object member value 
       keror = vxeror().cdeResult.deror; 
     if (keror === 0) { 
        logger.log("commande done"); 
     } else { 
      logger.log("article absent"); 
     } 
     } 
    function queryFailed(data) { 
       logger.log("commande failed"); //server errors 
     } 
} 

如果你喜歡代替對象,代碼因此其必須的返回實體也工作。 希望這有助於!