2016-03-19 6 views
1

У меня есть обычная хранимая процедура с параметрами, возвращающими поля разных таблиц, как я могу сопоставить этот пользовательский код, хранящийся в сущности? Я просто хочу использовать как значения только для чтения для отчета, который я не хочу сохранять, или что-то в этом роде. Я пытаюсь добавить дополнительные поля к наиболее похожим объектам, но когда я выполняю метод в коде, дополнительные поля равны нулюcodefluent custom хранимая процедура

ответ

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> 

Вы также можете использовать OnAfterReadRecord или OnBeforeReadRecord правила

0

Если это не так важно, чтобы вы сопоставить результаты пользовательской хранимой процедуры в сущности, чем другой вариант заключается в использовании встроенной поддержкой DataSets.

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. Убедитесь, что имена полей, возвращенные обеими хранимыми процедурами, совпадают.

Я думаю, что вышеупомянутое решение вашей непосредственной проблемы, но мне все еще не нравится решение. Причина в том, что вы сказали, что выбрали наиболее похожее сущность. Я думаю, что это вызовет проблемы в будущем, особенно если хранимая процедура не сопоставляется всем свойствам сущностей.

Я бы рекомендовал либо легкий объект, либо вид, либо DataSet.

Смежные вопросы