Параметры метода CQFL RAW теряют свои значения NULL по умолчанию в сгенерированном SQL

При создании метода RAW CFQL я заметил, что объявление параметров теряет свои значения NULL по умолчанию по сравнению с традиционным методом SEARCH.

Таким образом, сгенерированная процедура не будет принимать никаких нулевых аргументов. Обычно я хотел бы иметь:

CREATE PROCEDURE [dbo].[User_AdvancedSearch]
(
 @townIds [nvarchar] (max) = NULL,
 @townLabel [nvarchar] (256) = NULL
)

вместо

CREATE PROCEDURE [dbo].[User_AdvancedSearch]
(
 @townIds [nvarchar] (max),
 @townLabel [nvarchar] (256)
)
AS
SET NOCOUNT ON
DECLARE @sql nvarchar(max), @paramlist nvarchar(max)

SELECT @sql=
'SELECT 1,2'
SELECT @paramlist = 'townIds nvarchar (256), 
    @townLabel nvarchar (256)'
EXEC sp_executesql @sql
RETURN

Пример, используемый здесь, выглядит следующим образом

<cf:method name="AdvancedSearch">
      <cf:body text="RAW(string[] townIds, string townLabel)  " rawText="DECLARE @sql nvarchar(max), @paramlist nvarchar(max)&#xD;&#xA;&#xD;&#xA;SELECT @sql=&#xD;&#xA;'SELECT 1,2'&#xD;&#xA;SELECT @paramlist = 'townIds nvarchar (256), &#xD;&#xA;    @townLabel nvarchar (256)'&#xD;&#xA;EXEC sp_executesql @sql&#xD;&#xA;&#xD;&#xA;" language="tsql" />
    </cf:method>

1. Как сделать так, чтобы мой параметр по умолчанию был равен NULL в методе RAW?

Также я заметил, что свойство, указывающее тип возвращаемого значения (имя возвращаемого типа), похоже, не принимается во внимание. Сгенерированный метод возвращает void вместо выбранного типа и находится в классе Entity, а не в классе EntityCollection.

По этой ссылке 1 я прочитал, что Для синтаксис: RAW(аргументы). Вы должны указать тип возвращаемого значения в сетке свойств

Сгенерированный метод не учитывает это свойство и возвращает void, как показано ниже.

public static void AdvancedSearch(string[] townIds, string townLabel)
        {
            if ((townLabel == default(string)))
            {
                throw new System.ArgumentNullException("townLabel");
            }
            CodeFluent.Runtime.CodeFluentPersistence persistence = CodeFluentContext.Get(WcfServices.Model.Constants.WcfServices_ModelStoreName).Persistence;
            persistence.CreateStoredProcedureCommand(null, "User", "AdvancedSearch");
            persistence.AddParameter("@townIds", townIds);
            persistence.AddParameter("@townLabel", townLabel);
            System.Data.IDataReader reader = null;
            try
            {
                persistence.ExecuteNonQuery();
            }
            finally
            {
                if ((reader != null))
                {
                    reader.Dispose();
                }
                persistence.CompleteCommand();
            }
        }

2 - Как сделать так, чтобы процедура RAW CFQL возвращала соответствующий тип?

Спасибо за Ваш ответ.


person Olivier ROMAND    schedule 16.09.2016    source источник


Ответы (1)


Вы должны создать метод SEARCH() RAW:

<cf:method name="SearchRaw" body="SEARCH(string text1, string text2) RAW" rawBody="SELECT @text1" />

Если вы все еще хотите создать метод RAW, вам нужно установить параметры, которые могут принимать значение NULL, и указать тип возвращаемого значения:

<cf:method name="SearchRaw" body="RAW(string text1, string text2)" rawBody="SELECT 1" returnTypeName="{0}.CustomerCollection">
  <cf:parameter name="text1" nullable="true" />
  <cf:parameter name="text" nullable="true" />
</cf:method>
person meziantou    schedule 16.09.2016
comment
Спасибо за ваш ответ, это работает; но каждый раз, когда я сохраняю поверхность, базовый XML изменяется. В частности, вместо атрибутов body и rawBody я получаю атрибуты text и rawText, как в моем примере. Тег параметров также удаляется. - person Olivier ROMAND; 16.09.2016
comment
Хорошо, после того, как процедура RAW сгенерирована, перейдите в свойства › параметры › добавьте и установите правильные значения, несмотря на то, что синтаксис не совсем такой же; - person Olivier ROMAND; 16.09.2016