2016-03-10 2 views
1

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

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

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

Мне удалось создать метод SEARCH с непроверенными частями, но эти части не получат опционального в теле функции.

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

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 

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

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 stackoverflow */ 
    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 (More about default values), NULL будет отправлено в процедуру магазина.

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

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

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

public static EmployeeCollection Search(DateTime? fromDate, DateTime? toDate) 
+0

О, я не знал о параметре этого по умолчанию ценность предмет. Спасибо за этот замечательный ответ. –

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