Необязательный параметр в методе SEARCH CFQL не типа varchar

Возможно ли иметь функцию поиска, которая позволяла бы передавать необязательные параметры, кроме varchar (например, DateTime, decimal ..)?

Мне нужно искать строки, которые находятся в диапазоне дат. Пользователь должен иметь возможность поиска только по дате, или до даты, или даже в диапазоне от-до.

Мой подход заключался в создании метода SEARCH с параметрами Date. Они правильно преобразованы в объект DateTime в CFE, но я не смогу передать нулевое значение.

Мне удалось создать метод ПОИСКА с непроверенными частями, но эти части не будут опциональными в теле функции.

Как я могу получить параметры fromDate и to Date, которые можно установить как необязательные?

CFQL тело

SEARCH(string amount, string fromDate, string toDate, string otherEntityId, date date) WHERE [$Entity::Date$ >= CAST(@fromDate AS DATE)] AND [$Entity::Date$ <= CAST(@toDate AS DATE)] AND OtherEntity.OtherEntityId = @otherEntityId AND Amount = @amount and date = @date

Процедура кузова производится следующим образом. Обратите внимание на непроверенные части, которые не являются дополнительными

CREATE PROCEDURE [Schema].[Entity_NameOfProcedure]
(
 @amount [nvarchar] (256) = NULL,
 @fromDate [nvarchar] (256) = NULL,
 @toDate [nvarchar] (256) = NULL,
 @OtherEntityId [nvarchar] (256) = NULL,
 @date [date] = NULL,
 @_orderBy0 [nvarchar] (64) = NULL,
 @_orderByDirection0 [bit] = 0
)
AS
SET NOCOUNT ON
DECLARE @sql nvarchar(max), @paramlist nvarchar(max)

SELECT @sql=
'SELECT DISTINCT * /*on purpose for stackru */
    FROM [Schema].[Entity]
        LEFT OUTER JOIN [Schema].[OtherEntity] ON ([Schema].[Entity].[Entity_OtherEntity_OtherEntityId] = [Schema].[OtherEntity].[OtherEntity_OtherEntityId]) 
    WHERE (([Entity].[Entity_Date] >= CAST(@fromDate AS DATE) AND ([Entity].[Entity_Date] <= CAST(@toDate AS DATE) AND ((1 = 1) AND ((1 = 1) AND (([Schema].[OtherEntity].[OtherEntity_NumberInt] LIKE ''6%'') AND (1 = 1)))))) AND (1 = 1))'
SELECT @paramlist = '@amount nvarchar (256), 
    @fromDate nvarchar (256), 
    @toDate nvarchar (256), 
    @otherEntityId nvarchar (256), 
    @date date, 
    @_orderBy0 nvarchar (64), 
    @_orderByDirection0 bit'
IF @amount IS NOT NULL
    SELECT @sql = @sql + ' AND (([Schema].[Entity].[Entity_amount] = @amount))'
IF @otherEntityId IS NOT NULL
    SELECT @sql = @sql + ' AND (([Schema].[OtherEntity].[OtherEntity_OtherEntityId] = @OtherEntityId))'
IF @date IS NOT NULL
    SELECT @sql = @sql + ' AND (([Schema].[Entity].[Entity_Date] = @date))'
EXEC sp_executesql @sql, @paramlist,
    @amount, 
    @fromDate, 
    @toDate, 
    @OtherEntityId, 
    @date, 
    @_orderBy0, 
    @_orderByDirection0

RETURN
GO

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

1 ответ

Решение

Вы можете создать SEARCH метод с необязательными параметрами даты:

SEARCH(date fromDate, date toDate)
WHERE CreationDate >= @fromDate AND CreationDate <= @toDate

Это генерирует следующий SQL:

SELECT @sql=
'SELECT DISTINCT [Employee_Id], [Employee_FirstName], [Employee_CreationDate] 
    FROM [Employee]
    WHERE (1 = 1)'
SELECT @paramlist = '@fromDate datetime, @toDate datetime'
IF @fromDate IS NOT NULL
    SELECT @sql = @sql + ' AND (([Employee_CreationDate] >= @fromDate))'
IF @toDate IS NOT NULL
    SELECT @sql = @sql + ' AND (([Employee_CreationDate] <= @toDate))'

fromDate а также toDate параметры не обнуляются в сгенерированной спецификации. Однако, если вы используете значение по умолчанию, которое по умолчанию равно CodeFluentPersistence.DefaultDateTimeValue ( Подробнее о значениях по умолчанию), NULL будет отправлен в магазин процедуры.

Если вы предпочитаете DateTime? просто измените тип параметра с date в date?

SEARCH(date? fromDate, date? toDate)
WHERE CreationDate >= @fromDate AND CreationDate <= @toDate

Который генерирует следующий метод C#:

public static EmployeeCollection Search(DateTime? fromDate, DateTime? toDate)
Другие вопросы по тегам