2016-03-19 67 views
1

我有一個自定義存儲過程,在返回不同表的字段的參數如何我可以將此自定義存儲到實體?我只想使用只讀值作爲報告我不想保存或類似的東西我嘗試將額外的字段添加到最相似的實體,但是當我在代碼中執行該方法時額外的字段爲空codefluent自定義存儲過程

回答

1

解決方案1:使用視圖

視圖允許彙總來自不同實體的數據。

<Article> 
    <Id /> 
    <Name /> 
    <Lines typeName="LineCollection" /> 

    <cf:method name="LoadArticlesByCommand" body="load(string commandName) from ArticleByCommand where CommandName = @commandName" /> 

    <cf:view name="ArticleByCommand" autoLightweight="true"> 
     <ArticleName expression="Name"/> 
     <ArticleQty expression="Lines.Quantity" /> 
     <CommandName expression="Lines.Command.Name" /> 
    </cf:view> 
</Article> 

<Command> 
    <Id /> 
    <Name /> 
    <Lines typeName="LineCollection" /> 
</Command> 

<Line setType="List"> 
    <Article typeName="Article" key="true" /> 
    <Command typeName="Command" key="true" /> 
    <Quantity typeName="int" /> 
</Line> 

解決方案2:使用輕型實體

而不是創建一個視圖,你可以可以創建一個包含只使用了性能的輕質實體由存儲過程。

<cf:entity name="Person" lightweight="true"> 
    <cf:property name="FirstName" typeName="string" /> 
    <cf:property name="lastName" typeName="string" /> 

    <cf:method name="ComputeBalance" 
      body="load() raw" 
      rawBody="SELECT 'John' AS FirstName, 'Doe' AS LastName" /> 
</cf:entity> 

解決方案3:自定義映射

對於更具體的數值或類型,可以提供定製的方法,將數據庫中的值映射到.NET類型。這個自定義方法將以DataReader作爲參數被調用,這意味着開發人員可以做他想做的任何事情。

<cf:entity name="Sample"> 
    <cf:method name="LoadPair" body="raw" rawBody="SELECT 1234,5678" 
      returnTypeName="CodeFluent.Runtime.Utilities.Pair&lt;System.Int32,System.Int32&gt;" 
      cfom:methodName="On{0}" /> 
    <cf:snippet> 
    private static CodeFluent.Runtime.Utilities.Pair&lt;int,int&gt; OnLoadPair(System.Data.IDataReader reader) 
    { 
     return new Pair&lt;int, int&gt;(reader.GetInt32(0), reader.GetInt32(1)); 
    } 
    </cf:snippet> 
</cf:entity> 

您還可以使用OnAfterReadRecordOnBeforeReadRecord規則

0

如果你比另一個選擇是使用內置的數據集的支持自定義存儲過程的結果映射到實體它不是必需的。

http://blog.codefluententities.com/2011/06/22/dataset-support-in-codefluent-entities/

<cf:method name="LoadAllCities" body="raw" returnTypeName="System.Data.DataSet"> 
SELECT $Address::City$ FROM $Address$ 
</cf:method> 

DataSet ds = Address.LoadAllCities(); 
foreach (DataTable table in ds.Tables) 
{ 
    foreach (DataRow row in table.Rows) 
    { 
     Console.WriteLine("City: " + row[0]); 
    } 
} 
0

在重新閱讀你的問題時,我提供了另一個答案。

爲了迴應你說的部分「我嘗試將額外的字段添加到最相似的實體,但是當我在代碼中執行該方法時額外的字段爲空」。以下步驟應該能夠解決這個問題。

  1. 在SQL Management Studio中執行一個自動創建的存儲過程。
  2. 執行手動創建的存儲過程。
  3. 驗證兩個存儲過程返回的字段名是否匹配。

我認爲上述將解決您的直接問題,但我仍然不喜歡解決方案。原因是你說你選了最相似的實體。我認爲這將在將來導致問題,尤其是如果存儲過程未映射到所有實體屬性。

我會推薦輕量級實體,視圖或數據集。